2013-12-17 2 views
1

나는 웹 색인에서 복제 된 항목을 제외시키는 우아한 방법을 찾고 있습니다. 항목이 내 검색 결과에 중복으로 표시되도록하고 있습니다. 원래 항목 만 표시되고 복제본이없는 경우에는이 옵션을 선호합니다. 항목의 _Source 필드가 비어 있지 않은 경우인덱스에서 복제 된 항목을 전역으로 제외 하시겠습니까?

  1. 이 크게 부스트 값을 낮추기 위해 Global Item Boosting Rule을 만듭니다에 마음에 와서

    몇 가지 가능한 솔루션입니다. 이것은 점수를 낮추고 검색 결과에서 클론을 제거하지 않기 때문에 바람직하지 않습니다.

  2. 확장 된 Where 절을 사용하여 수행하는 모든 쿼리에서 복제 된 항목을 제외합니다. 이것은 모든 쿼리에이 절을 포함해야한다는 것을 기억해야하므로 바람직하지 않습니다. 또한 복제 된 항목은 여전히 ​​색인에 남아 있습니다.

사용자 정의 크롤러를 생성하고 복제 된 항목을 제외 할 것을에 로직을 추가 할 수 있습니다

답변

1

내 접근 방식은 다음과 같이이다 :

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

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

그것은 복제 및 비 최신 버전을 건너 뜁니다. 그런 다음 해당 파이프 라인 설정을 업데이트 : 난 그냥 대신 IsExcludedFromIndex를 오버라이드 (override) 할 수 있음을 추가 할

<indexing.filterIndex.inbound> 
    <processor type="XY.InboundIndexFilter, X.Y.Z"/> 
</indexing.filterIndex.inbound> 

More about inbound filters

5

Sitecore v7.1을.
내가 생각하는 접근 방식은 Sitecore.ContentSearch.SitecoreItemCrawler에서 상속 받고 DoAdd() 메서드를 재정의하는 클래스를 만드는 것입니다. 이 같은
뭔가 :

protected override void DoAdd(IProviderUpdateContext context, SitecoreIndexableItem indexable) 
{ 
    Assert.ArgumentNotNull((object) context, "context"); 
    Assert.ArgumentNotNull((object) indexable, "indexable"); 

    if (!indexable.Item.IsClone) 
    { 
     base.DoAdd(context, indexable); 
    } 
} 

은 그럼 당신은 설정을 사용자 정의 크롤러를 사용하도록 크롤러 설정이 필요합니다.
Sitecore.ContentSearch.<Lucene/Solr>.Index.<databasename>.config 파일에서 사용되는 크롤러를 정의합니다.
contentSearch/configuration/indexes/locations/crawler 요소를 업데이트하고 거기에서 수업을 가리켜 야합니다.

+1

. 그것은 당신이 성취하려는 것을 조금 더 말하고 있습니다. 그러나 두 가지 솔루션 모두 작동합니다. –

+0

제안에 감사드립니다, Jens! –

+0

'Sitecore.ContentSearch.SitecoreItemCrawler'는 봉인 된 클래스 인 것 같습니다. 내가 상속 할 수있는 또 다른 크롤러 클래스가 있습니까? –