如何在 Solr 5.3.0 中获取建议
How to get Suggestions in Solr 5.3.0
我正在尝试使用 Solr 5.3.0 实现自动完成功能
solrconfig.xml 看起来像这样
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">default</str>
<str name="lookupImpl">FuzzyLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">suggest_ngram</str>
<str name="weightField">price</str>
<str name="suggestAnalyzerFieldType">text_suggest_ngram</str>
<str name="buildOnStartup">true</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" >
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
托管架构如下所示:
<fieldType name="text_suggest_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="10" minGramSize="2" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<field name="suggest_ngram" type="text_suggest_ngram" indexed="true" stored="false"/>
<field name="name" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="price" type="tlong" multiValued="false" indexed="true" stored="true"/>
<copyField source="name" dest="suggest_ngram"/>
现在当我从 Solr 的管理面板使用分析器时,我可以看到索引的 ngram。并成功指出匹配。
但是当我使用查询时:
http://localhost:8983/solr/products/suggest?suggest=true&suggest.build=true&wt=json&suggest.q=Jind
我得到 0 条建议。
响应在这里:
https://api.myjson.com/bins/47r3i
其中一个文档中的名称键值 "Jindal Panther"。
此外,我发现如果我创建一个虚拟复制字段 "suggest",类型为 "String",来源为 "name",任何在 [=42= 上运行良好的建议] 不适用于 "suggest"。这可能是复制字段配置错误以启用建议吗?
如有任何帮助,我们将不胜感激。
提前致谢。
编辑:
得到了解决方案。请参阅下面接受的答案及其评论。
我遇到了一个很好地解释了 Suggesters 的博客。 Solr Search 新手绝对值得一读
您要配置建议的字段应该是 store=true
。它不需要被索引。 suggester 配置将根据 suggestComponet
中提供的配置构建字典。 name
字段已存储为 true
而 suggest_ngram
不是。您需要像这样更新架构配置:
<field name="suggest_ngram" type="text_suggest_ngram" indexed="false" stored="true"/>
您还需要提供参数suggest.dictionary
,您正在使用的词典作为建议。对你来说,名字是 default
.
http://localhost:8983/solr/products/suggest?suggest=true&
suggest.build=true&
wt=json&
suggest.dictionary=default&
suggest.q=Jind
或者您可以在 /suggest
的 requestHandler
中提供字典配置:
<str name="suggest.dictionary">default</str>
我正在尝试使用 Solr 5.3.0 实现自动完成功能
solrconfig.xml 看起来像这样
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">default</str>
<str name="lookupImpl">FuzzyLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">suggest_ngram</str>
<str name="weightField">price</str>
<str name="suggestAnalyzerFieldType">text_suggest_ngram</str>
<str name="buildOnStartup">true</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" >
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
托管架构如下所示:
<fieldType name="text_suggest_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="10" minGramSize="2" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<field name="suggest_ngram" type="text_suggest_ngram" indexed="true" stored="false"/>
<field name="name" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="price" type="tlong" multiValued="false" indexed="true" stored="true"/>
<copyField source="name" dest="suggest_ngram"/>
现在当我从 Solr 的管理面板使用分析器时,我可以看到索引的 ngram。并成功指出匹配。
但是当我使用查询时:
http://localhost:8983/solr/products/suggest?suggest=true&suggest.build=true&wt=json&suggest.q=Jind
我得到 0 条建议。 响应在这里: https://api.myjson.com/bins/47r3i
其中一个文档中的名称键值 "Jindal Panther"。
此外,我发现如果我创建一个虚拟复制字段 "suggest",类型为 "String",来源为 "name",任何在 [=42= 上运行良好的建议] 不适用于 "suggest"。这可能是复制字段配置错误以启用建议吗?
如有任何帮助,我们将不胜感激。 提前致谢。
编辑: 得到了解决方案。请参阅下面接受的答案及其评论。 我遇到了一个很好地解释了 Suggesters 的博客。 Solr Search 新手绝对值得一读
您要配置建议的字段应该是 store=true
。它不需要被索引。 suggester 配置将根据 suggestComponet
中提供的配置构建字典。 name
字段已存储为 true
而 suggest_ngram
不是。您需要像这样更新架构配置:
<field name="suggest_ngram" type="text_suggest_ngram" indexed="false" stored="true"/>
您还需要提供参数suggest.dictionary
,您正在使用的词典作为建议。对你来说,名字是 default
.
http://localhost:8983/solr/products/suggest?suggest=true&
suggest.build=true&
wt=json&
suggest.dictionary=default&
suggest.q=Jind
或者您可以在 /suggest
的 requestHandler
中提供字典配置:
<str name="suggest.dictionary">default</str>