是否可以在运行时(例如在查询中)为SuggestComponent提供动态字段或传递字段?
根据用户的语言,我想向他推荐不同的东西。我的动态字段name_*
包含具体字段:name_pl
,name_de
和name_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
您将如何实施此类机制?
答案 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)
有一种简单的方法可以做到这一点,不确定你是否意识到这一点:
检查文档here