尝试使用solr实现范围自动建议

时间:2015-11-03 14:02:05

标签: search solr autocomplete solrj autosuggest

我正在尝试像亚马逊等电子商务网站那样实施范围内的自动建议。

例如。 如果我输入 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给了我这个主意。

有任何意见吗?

3 个答案:

答案 0 :(得分:0)

我假设您要存储字段中的NamesToys数据,请将其称为category

您可以在payloadField定义中配置searchComponent参数,并将category数据传递给它。在您收到solr的建议结果后,在应用程序的后面,显示每个category的第一个建议或哪个策略更适合您的用例。

您可以在Solr Suggester中找到更多信息。

答案 1 :(得分:0)

  1. 建议组件似乎很有用,但在有效负载字段中,只能返回一个可能无法满足许多用例的字段。

  2. 通过Facet前缀,您无法从中间的单词中获取建议。因此,“乐高”将提供一个产品的建议,其名称字段中的值为“Legolas Sample”,但不是来自“Sample Legolas”。

  3. 第三种方法是实现autosuggest,方法是使用一个层EdgeNGramFilterFactory的索引分析器,然后搜索所需的前缀。

  4. 因此,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>