Search 尝试使用solr实现作用域自动建议

Search 尝试使用solr实现作用域自动建议,search,solr,autocomplete,solrj,autosuggest,Search,Solr,Autocomplete,Solrj,Autosuggest,我正试图在亚马逊等电子商务网站上实现范围有限的自动建议 例如。 如果我输入乐高,建议如下 乐高名称中的las 玩具中的乐高玩具 其中名称和玩具是solr字段名称 我从这次讨论中得到了最贴切的帮助: 这告诉我,这是不可能的,我目前正在使用的 到目前为止,使用suggester,我能够从单个solr字段实现自动建议。[自动建议字段,遵循建议者文档中的指南] 有什么想法/链接可以帮助我吗 更新 我尝试使用facet实现自动建议。我的查询类似于: http://localhost:8983/sol

我正试图在亚马逊等电子商务网站上实现范围有限的自动建议

例如。 如果我输入乐高,建议如下

  • 乐高名称中的las

  • 玩具中的乐高玩具

其中名称玩具是solr字段名称

我从这次讨论中得到了最贴切的帮助:

这告诉我,这是不可能的,我目前正在使用的

到目前为止,使用suggester,我能够从单个solr字段实现自动建议。[自动建议字段,遵循建议者文档中的指南]

有什么想法/链接可以帮助我吗

更新

我尝试使用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”开始,术语方面到字段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的文档链接?@SumeetSharma
    category
    将其添加到
    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>