Solr Suggester - 动态或在运行时字段传递

时间:2018-04-10 12:58:06

标签: solr lucene

是否可以在运行时(例如在查询中)为SuggestComponent提供动态字段或传递字段?

根据用户的语言,我想向他推荐不同的东西。我的动态字段name_*包含具体字段:name_plname_dename_en(可以更多,我希望在这里有灵活性)我想搜索建议取决于语言:对于pl我想在name_pl中获取建议,在name_en中获取建议等等。

到目前为止,我已经指定了标准的建议器:

      <searchComponent name="suggest" class="solr.SuggestComponent">
    <lst name="suggester">
      <str name="name">mySuggester</str>
      <str name="lookupImpl">FuzzyLookupFactory</str>
      <str name="dictionaryImpl">HighFrequencyDictionaryFactory</str>
      <str name="">name_pl</str>

      <str name="suggestAnalyzerFieldType">string</str>
      <str name="buildOnStartup">false</str>
    </lst>
  </searchComponent>

  <requestHandler name="/suggest" class="solr.SearchHandler"
                  startup="lazy" >
    <lst name="defaults">
      <str name="suggest">true</str>
      <str name="suggest.count">10</str>
    </lst>
    <arr name="components">
      <str>suggest</str>
    </arr>
  </requestHandler>

但实际上我需要使用name_*或最好在运行时传递字段名称,例如:http://localhost:8983/solr/services/suggest?suggest=true&suggest.build=true&suggest.dictionary=mySuggester&suggest.q=name& suggest.field = name_pl

您将如何实施此类机制?

2 个答案:

答案 0 :(得分:1)

这不是你可能会想到的答案,但我开始发表评论,我最终得到了这个。

通过在这里使用动态字段,您必须在每个查询中重建建议者,我建议;)您在查询时需要特定的suggestComponent'字典。

field的值应保持静态,因为它会被解析一次以从该字段构建字典索引。或者,每当建议查询需要除先前构建的字典之外的字典时,您必须删除/重建该索引。

相反,您应该为每种语言复制建议者定义,以便Solr可以为每个字段/语言构建一个字典索引(只需根据目标字段语言命名建议者):

<searchComponent name="suggest" class="solr.SuggestComponent">
  <lst name="suggester">
    <str name="name">suggest_nl</str>
    <str name="lookupImpl">FuzzyLookupFactory</str>
    <str name="dictionaryImpl">HighFrequencyDictionaryFactory</str>
    <str name="field">name_pl</str>
    <str name="suggestAnalyzerFieldType">string</str>
    <str name="buildOnStartup">false</str>
  </lst>
  <lst name="suggester">
    <str name="name">suggest_en</str>
    <str name="lookupImpl">FuzzyLookupFactory</str>
    <str name="dictionaryImpl">HighFrequencyDictionaryFactory</str>
    <str name="field">name_en</str>
    <str name="suggestAnalyzerFieldType">string</str>
    <str name="buildOnStartup">false</str>
  </lst>
  <!-- etc. -->
</searchComponent>

现在您可以动态查询目标字典:

.../suggest?suggest=true&suggest.q=name&suggest.dictionary=suggest_nl

答案 1 :(得分:0)

有一种简单的方法可以做到这一点,不确定你是否意识到这一点:

  1. 您为每种语言创建一个字典:suggester_pl,suggester_en ...每个使用正确的字段。它们都在一个SuggestComponent
  2. 中定义
  3. 在通话时,您可以选择使用&amp; suggest.dictionary = suggester_en
  4. 来选择哪一个

    检查文档here