我正在尝试使用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();
}
答案 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更难实现。主要有两个原因:
Sitecore.ContentSearch.LuceneProvider.Analyzers.NGramAnalyzer
不是为自动完成目的而构建的。NGramAnalyzer
分析您的搜索查询。通过使用Lucene作为您的搜索提供程序,您没有一个很好的schema.xml
,您可以根据需要配置索引和查询分析器。这需要在代码中手动完成。有关如何构建此类自动完成搜索的详细信息,请参阅this article。