Search 尝试使用solr实现作用域自动建议
我正试图在亚马逊等电子商务网站上实现范围有限的自动建议 例如。 如果我输入乐高,建议如下Search 尝试使用solr实现作用域自动建议,search,solr,autocomplete,solrj,autosuggest,Search,Solr,Autocomplete,Solrj,Autosuggest,我正试图在亚马逊等电子商务网站上实现范围有限的自动建议 例如。 如果我输入乐高,建议如下 乐高名称中的las 玩具中的乐高玩具 其中名称和玩具是solr字段名称 我从这次讨论中得到了最贴切的帮助: 这告诉我,这是不可能的,我目前正在使用的 到目前为止,使用suggester,我能够从单个solr字段实现自动建议。[自动建议字段,遵循建议者文档中的指南] 有什么想法/链接可以帮助我吗 更新 我尝试使用facet实现自动建议。我的查询类似于: http://localhost:8983/sol
- 乐高名称中的las
- 玩具中的乐高玩具
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”开始,术语方面到字段1和字段2
给了我这个主意
有什么意见吗?我假设您将
名称
或玩具
数据存储在字段中,让我们称之为类别
您可以在searchComponent
定义中配置payloadField
参数,并将category
数据传递给它。稍后在应用程序中,当您收到solr的建议结果时,显示每个类别的第一个建议,或者哪个策略更适合您的用例
您可以在中找到更多信息
Suggester组件似乎很有用,但在有效负载字段中,只能返回一个字段,这可能无法满足许多用例
通过小面前缀,你不能从中间得到一个词的建议。所以“乐高”将给出一个产品的建议,其名称字段中的值为“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"/>
因此,一旦您重新编制了数据索引,如果您查询“Lego”,它将给出“示例Legolas”和“Legolas示例”的结果。但是,如果您必须根据匹配的n个字段对这些结果进行分类,那么这将是n个不同的查询,这通常不是问题。您可以添加多个suggester组件。
为每个字段添加一个
例如:
<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>
名称建议者
混合英菲斯卢库普工厂
文档字典工厂
名字
人气
namesSuggesterIndexDir
建议者
玩具建议者
混合英菲斯卢库普工厂
文档字典工厂
玩具
人气
玩具商
建议者
您可以使用copyField将名称和玩具复制到一个字段中,然后使用edge ngram创建通配符标记。然后,您可以将其用作建议者的字段,或者您可能会更幸运地将其用作select的字段。你应该尝试一些实验。@tmbt用我所做的实验更新了我的答案。你能展示一些片段以便更好地理解吗?甚至一些关于如何使用payloadField的文档链接?@SumeetSharmacategory
将其添加到searchComponent
标记中。这是一个很好的解决方案,但从长远来看不是一个有帮助的解决方案。。如果将来我想转到动态字段,该怎么办?即使添加一个新字段,我也需要更新配置文件。。不管怎样,我用facets实现了它,在我的问题更新中有更多关于facets的细节。。。无论如何,谢谢……)
<copyField source="names" dest="names_ngram"/>
<copyField source="toys" dest="toys_ngram"/>
<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>