2013-11-04 7 views
2

Lucene.Net 및 Sitecore.Search.Crawlers.DatabaseCrawler를 사용하고 있습니다. 현재이 검색은 모든 필드에서 가능하며 일부 필드 만 검색하도록 변경하려고합니다.Lucene.Net으로 Sitecore 검색 : 특정 필드에서 검색

public class CustomCrawler : Sitecore.Search.Crawlers.DatabaseCrawler 
{ 
    protected override void AddAllFields(Lucene.Net.Documents.Document document, Sitecore.Data.Items.Item item, bool versionSpecific) 
    { 
     base.AddAllFields(document, item, versionSpecific); 
     document.Add(new Field("title", item["TitleField"], Field.Store.YES, Field.Index.TOKENIZED)); 
     document.Add(new Field("image", imageUrl, Field.Store.YES, Field.Index.TOKENIZED));  
    } 

    protected override bool IsMatch(Item item) 
    { 
     if (!item.TemplateName.Contains("txttmpl")) return false; 

     return base.IsMatch(item); 
    } 
} 

내가 검색 결과로 제목과 이미지 필드를 사용하여 웹 페이지를 표시 해요 : :

var list = new List<SearchResult>(); 
foreach (var result in results) 
{ 
    list.Add(new SearchResult() 
    { 
     Title = result.Document.GetField("title").StringValue(), 
     Image = result.Document.GetField("image").StringValue() 
    }); 
} 

var jss = new JavaScriptSerializer(); 
httpContext.Response.ContentType = "application/json"; 
httpContext.Response.Write(jss.Serialize(list)); 
httpContext.Response.Flush(); 

그리고 web.config 파일에서 : 나는 사용자 정의 크롤러가

<index id="myindex" type="Sitecore.Search.Index, Sitecore.Kernel"> 
    <param desc="name">$(id)</param> 
    <param desc="folder">Myfolder</param> 
    <Analyzer ref="search/analyzer" /> 
    <locations hint="list:AddCrawler"> 
     <web type="Search.CustomCrawler, Search"> 
      <Database>web</Database> 
      <Tags>web content</Tags> 
      <Root>/sitecore/content/Site</Root>        
      <Boost>2.0</Boost> 
     </web> 
    </locations> 
</index> 

위의 해결 방법은 모든 필드에서 찾아 볼 수 있습니다.
특정 필드 만 검색하려면 어떻게해야하나요? try.example.RemoveField ("SomeFieldName"),하지만 작동하지 않습니다. 일부 필드를 제거하거나 추가하는 방법은 무엇입니까? 미리 감사드립니다.

답변

4

다음과 같은 검색 구조를 사용하여 특정 필드를 검색 할 수 있습니다

인덱스는 인덱스 모든 필드에 설정 될 수 있으며,이 작업을 계속

 SearchManager.GetIndex("my_index").Rebuild(); 

     using (IndexSearchContext indexSearchContext = SearchManager.GetIndex("my_index").CreateSearchContext()) 
     { 
      // Field to be searched followed by search term 
      Term term = new Term("location", "Ottawa"); 
      Query query = new TermQuery(term); 

      SearchHits hits = indexSearchContext.Search(query, int.MaxValue); 
      // Get Sitecore items from the results of the query 
      List<Item> items = hits.FetchResults(0, int.MaxValue).Select(result => result.GetObject<Item>()).Where(item => item != null).ToList(); 
     } 
:

 <index id="my_index" type="Sitecore.Search.Index, Sitecore.Kernel"> 
     <param desc="name">$(id)</param> 
     <param desc="folder">dance_map_locations_index</param> 
     <Analyzer ref="search/analyzer" /> 
     <locations hint="list:AddCrawler"> 
      <core type="Sitecore.Search.Crawlers.DatabaseCrawler,Sitecore.Kernel"> 
      <Database>web</Database> 
      <Root>/sitecore/content/my first item/second item/parent item to be indexed</Root> 
      <templates hint="list:IncludeTemplate"> 
       <template>{AD7E2747-695A-4AC8-A6AB-C7C6111AF9A7}</template> 
      </templates> 
      </core> 
     </locations> 
     </index> 
0

을 당신은 shouldn ' 당신이 성취하고자하는 대부분의 것을 위해 커스텀 크롤러가 필요합니다. 당신이 바로 이미지 SRC를 추가하려고하고 완전하지 않을 것 같습니다 때문에, 그러나

<fields hint="raw:AddCustomField"> 
    <field luceneName="title" storageType="no" indexType="tokenized">TitleField</field> 
    <field luceneName="image" storageType="yes" indexType="untokenized">imageUrl</field> 
</fields> 

: 모든 필드를 추가에서 계속 다음과 같은 부분을 추가 할 <web> 노드 내부 <IndexAllFields>false</IndexAllFields>을 추가 할 수 있습니다 이미지 필드의 XML을 사용하려면 고급 데이터베이스 크롤러를 사용하고 dynamicField를 만들고 싶을 것입니다. http://sitecorian.github.io/SitecoreSearchContrib/

또는 Sitecore 7로 업그레이드 할 수있는 옵션이있는 경우 계산 된 필드를 만듭니다. 동적 필드 및 계산 필드에 대한 자세한 내용은 this question을 참조하십시오.

관련 문제