Sitecore& Lucene使用NGram搜索自动完成

时间:2016-04-18 14:42:36

标签: sitecore lucene.net sitecore8

我正在尝试使用Ngram为内容搜索设置自动完成功能。 这是我的lucene指数:

<autocompleteSearchConfiguration type="Sitecore.ContentSearch.LuceneProvider.LuceneIndexConfiguration, Sitecore.ContentSearch.LuceneProvider">
      <indexAllFields>false</indexAllFields>
      <initializeOnAdd>true</initializeOnAdd>
      <analyzer ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/analyzer" />
      <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
        <fieldNames hint="raw:AddFieldByFieldName">
          <field
            fieldName="page_title"
            storageType="YES"
            indexType="TOKENIZED"
            vectorType="NO"
            boost="1.5f"
            nullValue="NULL"
            emptyString="EMPTY"
            type="System.String"
            settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
            <analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.NGramAnalyzer, Sitecore.ContentSearch.LuceneProvider" />
          </field>
        </fieldNames>
      </fieldMap>
      <fields hint="raw:AddComputedIndexField">
        <field fieldName="page_title" storageType="yes">Client.Website.Code.Search.AutoCompleteTitle, Client.Website</field>
      </fields>
      <fieldReaders ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/fieldReaders"/>
      <indexFieldStorageValueFormatter ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/indexFieldStorageValueFormatter"/>
      <indexDocumentPropertyMapper ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/indexDocumentPropertyMapper"/>
      <documentBuilderType>Sitecore.ContentSearch.LuceneProvider.LuceneDocumentBuilder, Sitecore.ContentSearch.LuceneProvider</documentBuilderType>
    </autocompleteSearchConfiguration>

请注意我使用的是NgramAnalyzer(参考:Sitecore.ContentSearch.LuceneProvider.Analyzers)。

当我在luke中查看此索引时,我可以看到它显示正确的数据。 但是,以下iQueryable不会保留任何结果。

var index = ContentSearchManager.GetIndex("INDEX NAME GOES HERE");
using (var context = index.CreateSearchContext())
{
var query = context.GetQueryable<AutocompleteSearchResult>().Where(i => i.PageTitle == term)
var result = query.GetResults();
}

2 个答案:

答案 0 :(得分:2)

为什么不使用&#34; StartsWith&#34;而不是==?

请参阅this文章。

  

Sitecore为Lucene.net提供了一个n-gram分析器(Sitecore.ContentSearch.LuceneProvider.Analyzers)。如果使用Solr,则可以在Solr Schema.xml文件中进行设置。

     

您可以使用n-gram分析器为搜索输入创建自动完成功能。分析仪将令牌分为unigrams,bigrams,trigrams等。当用户键入单词时,n-gram分析器使用它生成的标记在不同位置查找单词。

     

通过向索引添加新字段并将此字段映射为使用n-gram分析器而不是默认值来添加对自动完成的支持。当您运行LINQ查询以查询该字段时,请使用以下代码:

using (IProviderSearchContext context = Index.CreateSearchContext())
        {
            result = context.GetQueryable<SearchResultItem>().
                .Where(i => i.Name.StartsWith(“some”))
                .Take(20)
                .ToList();
        }
  

Sitecore提供了一个使用三元组和一组英语停用词的实现。如果您有其他要求,可以构建新的分析器并更改这些设置。

答案 1 :(得分:1)

使用n-gram在Sitecore中构建自动完成搜索对于使用Lucene而言比使用Solr更难实现。主要有两个原因:

  1. 您需要创建自己的分析器,因为Sitecore.ContentSearch.LuceneProvider.Analyzers.NGramAnalyzer不是为自动完成目的而构建的。
  2. 您需要阻止NGramAnalyzer分析您的搜索查询。通过使用Lucene作为您的搜索提供程序,您没有一个很好的schema.xml,您可以根据需要配置索引和查询分析器。这需要在代码中手动完成。
  3. 有关如何构建此类自动完成搜索的详细信息,请参阅this article