【问题标题】:Trying to implement scoped autosuggestions with solr尝试使用 solr 实现范围自动建议
【发布时间】:2015-11-03 14:02:04
【问题描述】:

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

例如。 如果我输入 Lego ,建议应该像

  • 乐高名字中的拉斯

  • 乐高在玩具中

其中 NamesToys 是 solr 字段名称。

我得到的最接近的帮助来自这个讨论: solr autocomplete with scope is it possible?

这告诉我,我目前使用的 suggester 是不可能的。

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

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

更新

我尝试使用构面实现自动建议。我的查询类似于:

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 给了我这个想法。

有没有cmets?

【问题讨论】:

  • 您可以使用 copyField 将 Names 和 Toys 复制到一个字段中,然后使用边缘 ngram 创建通配符标记。然后,您可以将其用作建议者的字段,或者将其用作带有 select 的字段可能会更好。你应该尝试一些实验。
  • @TMBT 用我的实验更新了我的答案。

标签: search solr autocomplete solrj autosuggest


【解决方案1】:

我假设您将NamesToys 数据存储为字段,我们称之为category

您可以在searchComponent定义中配置payloadField参数,并将category数据传入其中。稍后在应用程序中,当您收到来自 solr 的建议结果时,显示来自每个 category 的第一个建议,或者哪种策略更适合您的用例。

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

【讨论】:

  • 你能展示一些sn-p以便更好地理解吗?甚至一些关于如何使用payloadField的文档链接?
  • @SumeetSharma <str name="payloadField">category</str> 将此添加到searchComponent 标记中。
【解决方案2】:
  1. Suggester 组件看起来很有用,但在有效负载字段中,只能返回一个字段,这可能无法满足许多用例。

  2. 通过 Facet 前缀,您无法从中间的单词中获得建议。因此,“Lego”将给出名称字段值为“Legolas Sample”但不是来自“Sample Legolas”的产品的建议。

  3. 第三种实现自动建议的方法是使用具有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"/>

因此,一旦您重新索引了数据,如果您查询“Lego”,它将同时提供“Sample Legolas”和“Legolas Sample”的结果。但是,如果您必须根据它们匹配的 n 个字段对这些结果进行分类,那将是 n 个不同的查询,这通常不是问题。

【讨论】:

    【解决方案3】:

    您可以添加多个建议器组件。 为每个字段添加一个。

    例如:

    <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>
    

    【讨论】:

    • 很好的解决方案,但从长远来看不是一个有用的解决方案。如果我将来想转向动态领域怎么办?即使添加一个新字段,我也需要更新配置文件..无论如何我使用方面实现了它,更多细节在我的问题更新中......无论如何谢谢.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2012-07-29
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多