수색…


비고

Sitecore 검색은 Lucene 위에 구축되어 사이트에 대해 매우 빠른 검색 기능을 만들 수 있습니다. 중앙 집중식 데이터베이스 (예 : Sitecore의 SQL DB)에 대해 쿼리하는 대신 웹 서버의 실제 파일 시스템에 저장된 Lucene 인덱스 파일을 쿼리합니다. Sitecore는 Lucene.NET API를 통해 추상화 계층을 제공합니다. LINQ 제공자는 Lucene 쿼리를 .NET 개발자에게 간단하고 익숙한 프로세스로 작성하도록합니다. Sitecore는 자신 만의 확장 또는 정의가 가능한 표준 색인을 제공합니다. SOLR을 사용할 수도 있습니다. Lucene 위에 구축 된 중앙 집중적이고 확장 가능한 플랫폼입니다.

구성

Sitecore는 확장 할 수있는 미리 설정된 표준 색인 세트를 제공하거나 직접 정의 할 수 있습니다. 사전 구성된 sitecore_master_indexsitecore_web_index 는 사이트 검색에 가장 많은 관심을 sitecore_web_index . 마스터 및 웹 데이터베이스의 트리에있는 모든 Sitecore 항목에 대해 미리 정의 된 색인이며 모든 템플릿에서 공통적으로 사용되는 Sitecore 항목의 표준 입력란을 모두 저장하도록 구성되어 있습니다.

다음 위치에서 표준 웹 색인의이 구성을 볼 수 있습니다. <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.Index.Web.config

색인 구성의 주요 중요 영역은 다음과 같습니다.

  • 필드 구성 - 어떤 필드를 인덱스에 저장해야하며 어떻게 저장해야합니까?
  • 전략 - 색인을 언제 어떻게 업데이트해야합니까?
  • 크롤러 - 색인이 Sitecore 데이터를 가져올 수있는 위치

필드 구성

sitecore_web_index 설정을 보면 다음과 같은 참조를 볼 수 있습니다 : <configuration ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration" /> . 이것은 <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.config 에있는 공유 인덱스 구성 파일을 나타냅니다. 여기서 표준 구성에 포함 된 모든 필드를 볼 수 있습니다.

기본적으로 필드를 정의하는 두 가지 방법이 있습니다. 하나는 필드가 Sitecore 항목 필드에서 직접 소싱되거나 계산 된 필드입니다. 계산 된 필드를 사용하면 계산을 수행하고 결과를 필드에 저장할 수있는 코드를 작성할 수 있습니다. 인덱스가 인덱스를 쿼리하지 않을 경우 업데이트 / 작성 될 때이 코드가 실행 얻을 것이다. 필드가 집계 된 데이터 (예 : 개수 등)를 저장해야하는 경우에 특히 유용합니다.

<fieldMap> 요소 내에는 <fieldMap> <fieldNames hint="raw:AddFieldByFieldName"><fields hint="raw:AddComputedIndexField"> 요소가 표시됩니다.이 요소에는 직접 <fields hint="raw:AddComputedIndexField"> 필드와 계산 된 필드가 각각 들어 있습니다.

계략

색인 전략에 따라 색인이 갱신되는시기가 결정됩니다. 선택할 수있는 옵션은 다음과 같습니다.

  • OnPublishEndAsynchronousStrategy (onPublishEndAsync) - 항목이 게시되면 인덱스가 비동기 적으로 업데이트됩니다.
  • SynchronousStrategy (syncMaster) - 항목이 저장되면 색인이 즉시 업데이트됩니다.
  • IntervalAsynchronousStrategy (intervalAsyncCore / intervalAsyncMaster) - 주기적으로 항목 업데이트를 확인하고 인덱스를 비동기 적으로 업데이트합니다.
  • ManualStrategy - 자동 인덱스 업데이트가 없습니다. 색인은 수동으로 만 업데이트됩니다 (제어판 또는 프로그래밍 방식으로).
  • RebuildAfterFullPublishStrategy (rebuildAfterFullPublish) - 게시 후에 인덱스가 전체적으로 다시 작성됩니다.
  • RemoteRebuildStrategy (remoteRebuild) -이 전략은 Sitecore의 여러 인스턴스에 대한 것입니다. 예를 들어 콘텐츠 관리 서버에서 다시 작성해야하는 경우 원격 콘텐츠 배달 서버가이 이벤트에 가입하고 자체 인덱스를 다시 작성합니다.

기본적으로 마스터 인덱스는 syncMaster 로 구성됩니다. 이는 경험 편집기에서 항목을 저장하고 페이지의 렌더링에서 색인의 결과를 표시하는 경우 결과에서 항목에 대한 변경 사항을 즉시 확인해야하기 때문입니다. 웹 색인은 'onPublishEndAsync'로 구성됩니다. 이는 웹 데이터베이스의 색인이 항목이 마스터 데이터베이스에서 웹으로 게시 될 때만 업데이트하면되기 때문입니다.

여러 전략을 결합 할 수도 있습니다. 예를 들어 콘텐츠 관리 (CM) 및 콘텐츠 전달 (CD)에 대해 별도의 Sitecore 인스턴스가있는 경우 onPublishEndAsyncremoteRebuild 와 결합하여 항목이 게시 될 때 CD 인덱스가 업데이트되고 사용자가 CM 서버의 제어판에서 재구성을 트리거합니다.

다음 구성을 사용하여 전략을 선택할 수 있습니다.

<strategies hint="list:AddStrategy">
    <strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/onPublishEndAsync" />
</strategies>

크롤러

이렇게하면 색인을 생성하려는 Sitecore 데이터의 위치를 ​​지정할 수 있습니다. 웹 색인의 기본 구성은 다음과 같습니다.

<locations hint="list:AddCrawler">
    <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
        <Database>web</Database>
        <Root>/sitecore</Root>
    </crawler>
</locations> 

두 가지 중요한 비트는 <Database><Root> 요소입니다. <Root> 요소를 사용하면 Sitecore 트리에서 색인이 색인화해야하는 시작 위치를 지정할 수 있습니다. 실제로, 콘텐츠 노드 아래에 '홈'노드가 있으므로이 노드는 템플릿이 아닌 실제 콘텐츠 / 페이지 만 인덱싱 할 수 있습니다.

검색을위한 인바운드 필터 만들기

인바운드 필터는 항목이 검색 색인에 추가 될 때 적용되며 항목이 색인에 포함되는지 여부를 지정할 수 있습니다.

인바운드 필터를 사용할 수있는 예 - 인덱스에 표준 값 및 이전 버전의 항목을 포함하지 않습니다.

인바운드 필터는 구성에서 설정됩니다.

<indexing.filterIndex.inbound>
 <processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyInboundIndexFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.inbound>  

코드 구현 :

public class ApplyInboundIndexVersionFilter : InboundIndexFilterProcessor   
{        
    public override void Process(InboundIndexFilterArgs args)       
    { 
        var item = args.IndexableToIndex as SitecoreIndexableItem;

        if (!item.Item.Versions.IsLatestVersion())            
        {                  
            args.IsExcluded = true;            
        }
    }
}

더 많은 예제와 정보는 http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- 에서 찾을 수 있습니다 . filter-pipelines.aspx

검색을위한 아웃 바운드 필터 만들기

아웃 바운드 필터를 사용하여 검색 결과를 필터링 할 수 있습니다.

아웃 바운드 필터 사용 예제 중 하나는 사용자가 검색 결과에서 액세스 할 수없는 항목을 제거하는 것입니다.

아웃 바운드 필터가 구성에 설정됩니다.

<indexing.filterIndex.outbound>
 <processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyOutboundSecurityFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.outbound>

발신 필터 구현의 예 :

public class ApplyOutboundIndexWorkflowFilter : OutboundIndexFilterProcessor   
{        
    public override void Process(OutboundIndexFilterArgs args)       
    { 
        //You can use args.IsExcluded to remove items from the search results here
    }
}

더 많은 예제와 정보는 http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- 에서 찾을 수 있습니다 . filter-pipelines.aspx

새 버전을 추가 할 때 색인에서 이전 버전의 항목을 모두 삭제하십시오.

기본적으로 Sitecore는 모든 버전의 항목을 sitecore_master_index에 추가합니다. 그 결점은 사용자가 워크 플로를 사용하고 많은 버전을 추가 할 경우 모든 콘텐츠 편집기가 콘텐츠 편집기의 검색 결과에 추가된다는 것입니다.

구성 :

<event name="item:versionAdded" >
              <handler type="FilterPatch.Library.ContentSearch.EventHandler, AssemblyName" method="Execute" />
       </event>

핸들러 구현

public class EventHandler
    {
        public void Execute(object sender, EventArgs eventArgs)
        {
            var item = Event.ExtractParameter(eventArgs, 0) as Item;

            //If item has less than 2 versions - then skip
            if(item.Versions.Count < 2)
            {
                return;
            }

            var indexableItem = new SitecoreIndexableItem(item);

            var index = ContentSearchManager.GetIndex(indexableItem);

            using (var context = index.CreateDeleteContext())
            {
                foreach(var version in item.Versions.GetVersions(true))
                {
                    if(!version.Versions.IsLatestVersion())
                    {
                        var indexableItemVersion = new SitecoreIndexableItem(version);
                        context.Delete(indexableItemVersion.UniqueId);
                    }
                }
                context.Commit();                
            }
        }
    }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow