Solr:特定自动完成的多个建议者
Solr: multiple suggester for specific autocomplete
我有以下问题:
我有一个具有多个索引的 Solr 核心。例如,我的网站上有 3 种不同的搜索类型:
- 汽车
- DVD
- 所有物品(汽车、DVD 和其他物品)
我有 Nr.3 的自动建议。到目前为止,1 和 2 还没有建议者。但我想为汽车实施一个额外的建议器,这样当我只想在汽车中搜索时,建议器会向我显示仅属于汽车而不属于 dvds 等的词。我正在考虑新的 requestHandler 并执行搜索,因为我需要这两个特定字段来填写建议,其中 Nr.3 搜索是通过字典自动填写的。
是否可以在一个 Solr Core 中有两个或多个不同的建议者?我如何使用特定搜索类型的特定字段进行自动完成和建议,以便在这些建议中仅列出汽车属性?
当然可以。只需像这样设置两个搜索组件:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">suggest_cars</str>
<str name="lookupImpl">BlendedInfixLookupFactory</str>
<str name="blenderType">linear</str>
<str name="dictionaryimpl">DocumentDictionaryFactory</str>
<str name="field">cars_suggest</str>
<str name="weightField">popularity</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<str name="queryAnalyzerFieldType">phrase_suggest</str>
<str name="indexPath">cars_suggest</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
<bool name="exactMatchFirst">true</bool>
</lst>
<lst name="suggester">
<str name="name">suggest_all</str>
<str name="lookupImpl">BlendedInfixLookupFactory</str>
<str name="blenderType">linear</str>
<str name="dictionaryimpl">DocumentDictionaryFactory</str>
<str name="field">suggest</str>
<str name="weightField">popularity</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<str name="queryAnalyzerFieldType">phrase_suggest</str>
<str name="indexPath">all_suggest</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
<bool name="exactMatchFirst">true</bool>
</lst>
然后创建请求处理程序:
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="echoParams">all</str>
<str name="wt">json</str>
<str name="indent">false</str>
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
在schema.xml文件中,这两个字段类型:
<fieldType name="phrase_suggest" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
</analyzer>
</fieldType>
当然,您需要两个字段 cars_suggest 和 all_suggest 分别包含汽车和 cars/dvds 的建议术语,字段类型为 phrase_suggest(即带有关键字分词器)。
查询完成如下:
http://localhost:8983/solr/collection0/suggest?q=peug&suggest.dictionary=suggest_cars
我有以下问题: 我有一个具有多个索引的 Solr 核心。例如,我的网站上有 3 种不同的搜索类型:
- 汽车
- DVD
- 所有物品(汽车、DVD 和其他物品)
我有 Nr.3 的自动建议。到目前为止,1 和 2 还没有建议者。但我想为汽车实施一个额外的建议器,这样当我只想在汽车中搜索时,建议器会向我显示仅属于汽车而不属于 dvds 等的词。我正在考虑新的 requestHandler 并执行搜索,因为我需要这两个特定字段来填写建议,其中 Nr.3 搜索是通过字典自动填写的。 是否可以在一个 Solr Core 中有两个或多个不同的建议者?我如何使用特定搜索类型的特定字段进行自动完成和建议,以便在这些建议中仅列出汽车属性?
当然可以。只需像这样设置两个搜索组件:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">suggest_cars</str>
<str name="lookupImpl">BlendedInfixLookupFactory</str>
<str name="blenderType">linear</str>
<str name="dictionaryimpl">DocumentDictionaryFactory</str>
<str name="field">cars_suggest</str>
<str name="weightField">popularity</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<str name="queryAnalyzerFieldType">phrase_suggest</str>
<str name="indexPath">cars_suggest</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
<bool name="exactMatchFirst">true</bool>
</lst>
<lst name="suggester">
<str name="name">suggest_all</str>
<str name="lookupImpl">BlendedInfixLookupFactory</str>
<str name="blenderType">linear</str>
<str name="dictionaryimpl">DocumentDictionaryFactory</str>
<str name="field">suggest</str>
<str name="weightField">popularity</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<str name="queryAnalyzerFieldType">phrase_suggest</str>
<str name="indexPath">all_suggest</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
<bool name="exactMatchFirst">true</bool>
</lst>
然后创建请求处理程序:
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="echoParams">all</str>
<str name="wt">json</str>
<str name="indent">false</str>
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
在schema.xml文件中,这两个字段类型:
<fieldType name="phrase_suggest" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
</analyzer>
</fieldType>
当然,您需要两个字段 cars_suggest 和 all_suggest 分别包含汽车和 cars/dvds 的建议术语,字段类型为 phrase_suggest(即带有关键字分词器)。
查询完成如下:
http://localhost:8983/solr/collection0/suggest?q=peug&suggest.dictionary=suggest_cars