>

Sitecore 6.2 기반 사이트에서는 검색 결과에서 항목을 선택적으로 제외 할 수있는 기능을 사용자에게 제공해야합니다.

이 작업을 수행하기 위해 "검색 결과에 포함"이라는 확인란 필드를 추가하고 해당 필드 값을 확인하기 위해 사용자 지정 데이터베이스 크롤러를 만들었습니다.

~ \ App_Config \ Include \ Search Indexes \ Website.config :

<search>
  <configuration type="Sitecore.Search.SearchConfiguration, Sitecore.Kernel" singleInstance="true">
    <indexes hint="list:AddIndex">
      <index id="website" singleInstance="true" type="Sitecore.Search.Index, Sitecore.Kernel">
        ...
        <locations hint="list:AddCrawler">
          <master type="MyProject.Lib.Search.Indexing.CustomCrawler, MyProject">
            ...
          </master>
          <!-- Similar entry for web database. -->
        </locations>
      </index>
    </indexes>
  </configuration>
</search>

~ \ Lib \ Search \ Indexing \ CustomCrawler.cs :

using Lucene.Net.Documents;
using Sitecore.Search.Crawlers;
using Sitecore.Data.Items;
namespace MyProject.Lib.Search.Indexing
{
  public class CustomCrawler : DatabaseCrawler
  {
    /// <summary>
    ///   Determines if the item should be included in the index.
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    protected override bool IsMatch(Item item)
    {
      if (item["include in search results"] != "1")
      {
        return false;
      }
      return base.IsMatch(item);
    }
  }
}

흥미로운 점은 인덱스 뷰어 응용 프로그램을 사용하여 인덱스를 다시 작성하면 모든 것이 정상적으로 동작한다는 것입니다. '검색 결과에 포함'확인란이 선택되어 있지 않은 항목은 검색 색인에 포함되지 않습니다.

그러나 Sitecore Control Panel 응용 프로그램에서 검색 색인 재구성기를 사용하거나 IndexingManager가 검색 색인을 자동 업데이트하면 "검색 결과에 포함"확인란의 상태에 관계없이 모든 항목이 포함됩니다.

또한 사용자 정의 크롤러 클래스에 수많은 중단 점을 설정했으며 내장 인덱서를 사용하여 검색 색인을 다시 빌드 할 때 애플리케이션이 중단 점을 찾지 못했습니다. 인덱스 뷰어를 사용하면 설정 한 모든 중단 점에 도달합니다.

"검색 결과에 포함"체크 상자를 준수하기 위해 Sitecore의 내장 색인 생성 프로세스를 얻으려면 어떻게합니까?


  • 답변 # 1

    어제 Alex Shyba와 이야기를 나 spoke 고, 우리는 무슨 일이 있었는지 알 수있었습니다. 구성에 문제가있어 모든 것이 올바르게 작동하지 않습니다.

    Seth가 지적했듯이 Sitecore에는 두 가지 고유 한 검색 API가 있습니다. 내 구성 파일이 둘 다 사용하고있었습니다. 최신 API를 사용하려면 sitecore/search/configuration  섹션을 설정해야합니다 (OP에 게시 한 것 외에도 sitecore/indexes 에 색인을 추가했습니다.  그리고 sitecore/databases/database/indexes (정확하지 않습니다).

    IsMatch() 를 재정의하는 대신 , 나는 AddItem() 를 재정의 했어야했다 . Lucene의 작동 방식으로 인해 문서를 제자리에 업데이트 할 수 없습니다. 대신 먼저 삭제 한 다음 업데이트 된 버전을 추가해야합니다.

    와이즈 비즈  실행, 그것은 Sitecore.Search.Crawlers.DatabaseCrawler.UpdateItem() 를 확인  항목을 삭제하고 다시 추가해야하는지 확인하십시오. 만약 IsMatch()  false를 반환하면 항목이처음에 없어도색인에서 제거되지 않습니다

    . IsMatch() 를 재정의함으로써 기존 문서가 이미 삭제 된 후 색인에 항목을 추가해야하는지 크롤러에 지시 할 수있었습니다. 업데이트 된 클래스는 다음과 같습니다.

    ~ \ Lib \ Search \ Indexing \ CustomCrawler.cs :

    AddItem()
    
    

    Alex는 또한 일부 확장 성 설정이 잘못되었다고 지적했습니다. 구체적으로 :

    와이즈 비즈  설정이 비어있어서 시스템 이름이 실행간에 변경 될 수있는 임시 (클라우드) 인스턴스에서 문제가 발생할 수 있습니다. 각 인스턴스에서이 설정을 일정하고 고유 한 값으로 변경했습니다 (예 : using Sitecore.Data.Items; using Sitecore.Search; using Sitecore.Search.Crawlers; namespace MyProject.Lib.Search.Indexing { public class CustomCrawler : DatabaseCrawler { protected override void AddItem(Item item, IndexUpdateContext context) { if (item["include in search results"] == "1") { base.AddItem(item, context); } } } }  그리고 InstanceName ).

    와이즈 비즈  설정은 CMS 여야합니다  각 인스턴스가 검색 색인을 마지막으로 업데이트 한 시점에 대한 자체 레코드를 유지합니다.

    와이즈 비즈  설정은 CD 여야합니다  검색 색인 생성과 캐시 플러시 프로세스 간의 경쟁 조건을 방지합니다.

    개발 중 Indexing.ServerSpecificProperties  상대적으로 작은 값으로 설정해야합니다 (예 : true ). 프로덕션 환경에는 좋지 않지만 검색 색인 문제를 해결할 때 수행해야하는 대기 시간을 줄일 수 있습니다.

    원격 게시 대상을 포함하여 각 웹 데이터베이스에 대해 기록 엔진이 켜져 있는지 확인하십시오.

    EnableEventQueues
    
    

    Sitecore 백엔드에 액세스 할 수 없으므로 CD 인스턴스에서 검색 색인을 수동으로 다시 작성하기 위해 RebuildDatabaseCrawlers.aspx도 설치했습니다.

  • 답변 # 2

    내가 알아 낸 것 같습니다. 중간 해결책.

    Wyzwyz의 흥미로운 스 니펫이 있습니다. 제어판 애플리케이션의 검색 색인 재 구축 프로그램에서 호출합니다.

    true
    
    

    Indexing.UpdateInterval   00:00:15 세트를 포함 데이터베이스 크롤러를 사용하여 색인을 다시 작성하지 않습니다!

    즉, 내장 검색 인덱서는 <database id="production"> <Engines.HistoryEngine.Storage> <obj type="Sitecore.Data.$(database).$(database)HistoryStorage, Sitecore.Kernel"> <param connectionStringName="$(id)" /> <EntryLifeTime>30.00:00:00</EntryLifeTime> </obj> </Engines.HistoryEngine.Storage> <Engines.HistoryEngine.SaveDotNetCallStack>false</Engines.HistoryEngine.SaveDotNetCallStack> </database> 의 검색 구성 설정을 무시하는 검색 인덱스를 다시 작성할 때 완전히 다른 클래스를 사용합니다.  전적으로

    이 문제를 해결하기 위해 다음 파일을 변경했습니다. ~ \ App_Config \ Include \ Search Indexes \ Website.config :

    Sitecore.Shell.Applications.Search.RebuildSearchIndex.RebuildSearchIndexForm.Builder.Build()
    
    

    ~ \ Lib \ Search \ Indexing \ CustomIndex.cs :

    for (int i = 0; i < database.Indexes.Count; i++)
    {
      database.Indexes[i].Rebuild(database);
      ...
    }
    
    

    이 방법의 유일한 경고는 선택한 데이터베이스뿐만 아니라모든데이터베이스에 대한 인덱스를 다시 작성한다는 것입니다. Sitecore에는 인덱스를 다시 작성하기위한 완전히 별도의 두 가지 방법이 있습니다.

  • 답변 # 3

    Sitecore 6.2는 기존 검색 API와 최신 검색 API를 모두 사용하므로 색인 생성 방식이 다릅니다. CMS 6.5 (곧 출시 예정)는 최신 API (예 : Sitecore.Search)를 사용합니다

    database.Indexes

  • 이전 .net - WinMD/WinRT 구성 요소에 노출 된 유형을 밀봉해야하는 이유는 무엇입니까?
  • 다음 emacs - Emacs 및 AUCTeX를 사용하여 오른쪽에서 왼쪽으로 단락 내에서 왼쪽에서 오른쪽으로 처리