我正在尝试像亚马逊等电子商务网站那样实施范围内的自动建议。
例如。 如果我输入 Lego ,建议应该是
Lego las in Names
乐高
其中名称和玩具是solr字段名称。
我得到的最紧急援助来自这次讨论: solr autocomplete with scope is it possible?通知我,目前使用的suggester无法使用。
到目前为止,使用建议器我能够从单个solr字段实现自动建议。 [autosuggest字段,遵循建议文档中的指导原则]
任何可以帮助我的想法/链接?
更新
我尝试使用facet实现自动建议。我的查询类似于:
http://localhost:8983/solr/core1/select?q=*%3A*&rows=0&wt=json&indent=true&facet=true&facet.field=field1&facet.field=field2&facet.prefix=i
这给了我所有的方面结果,以字母'i'开头,术语分面为field1和field2。
This给了我这个主意。
有任何意见吗?
答案 0 :(得分:0)
我假设您要存储字段中的Names
或Toys
数据,请将其称为category
。
您可以在payloadField
定义中配置searchComponent
参数,并将category
数据传递给它。在您收到solr的建议结果后,在应用程序的后面,显示每个category
的第一个建议或哪个策略更适合您的用例。
您可以在Solr Suggester中找到更多信息。
答案 1 :(得分:0)
建议组件似乎很有用,但在有效负载字段中,只能返回一个可能无法满足许多用例的字段。
通过Facet前缀,您无法从中间的单词中获取建议。因此,“乐高”将提供一个产品的建议,其名称字段中的值为“Legolas Sample”,但不是来自“Sample Legolas”。
第三种方法是实现autosuggest,方法是使用一个层EdgeNGramFilterFactory
的索引分析器,然后搜索所需的前缀。
因此,solr架构看起来像
<field name="names" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="toys" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="names_ngram" type="text_suggest_ngram" multiValued="false" indexed="true" stored="false"/>
<field name="toys_ngram" type="text_suggest_ngram" multiValued="false" indexed="true" stored="false"/>
并且字段类型将具有
的定义<fieldType name="text_suggest_ngram" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<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>
这些_ngram
字段将是一个副本字段:
<copyField source="names" dest="names_ngram"/>
<copyField source="toys" dest="toys_ngram"/>
因此,一旦您重新编制了数据索引,如果您查询“乐高”,它将提供“Sample Legolas”和“Legolas Sample”的结果。但是,如果您必须根据匹配的n个字段对这些结果进行分类,那么这将是n个不同的查询,这通常不是问题。
答案 2 :(得分:0)
您可以添加多个建议者组件。 为每个字段添加一个。
E.g。 :
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">namesSuggester</str>
<str name="lookupImpl">BlendedInfixLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">Names</str>
<str name="weightField">Popularity</str>
<str name="indexPath">namesSuggesterIndexDir</str>
<str name="suggestAnalyzerFieldType">suggester</str>
</lst>
<lst name="suggester">
<str name="name">toysSuggester</str>
<str name="lookupImpl">BlendedInfixLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">Toys</str>
<str name="weightField">Popularity</str>
<str name="indexPath">toysSuggesterIndexDir</str>
<str name="suggestAnalyzerFieldType">suggester</str>
</lst>
</searchComponent>