【问题标题】:Solr: multiple suggester for specific autocompleteSolr:特定自动完成的多个建议器
【发布时间】:2016-10-24 13:55:14
【问题描述】:

我有以下问题: 我有一个具有多个索引的 Solr 核心。例如,我的网站上有 3 种不同的搜索类型:

  1. 汽车
  2. DVD
  3. 所有物品(汽车、DVD 可能还有其他物品)

我有 Nr.3 的自动建议。 1 和 2 到目前为止没有建议者。但是我想为汽车实现一个额外的建议器,这样当我只想在汽车中搜索时,建议器会显示只属于汽车而不属于 dvds 等的单词。我正在考虑新的 requestHandler 并执行搜索,因为我需要这两个特定字段来填充通过字典自动填充 Nr.3 搜索的建议。 一个 Solr Core 中是否可以有两个或多个不同的建议者?以及如何将特定搜索类型的特定字段用于自动完成和建议,以便这些建议中仅列出汽车属性?

【问题讨论】:

    标签: solr autocomplete autosuggest


    【解决方案1】:

    当然可以。只需设置两个搜索组件,如下所示:

    <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 分别包含汽车和汽车/dvds 的建议术语,字段类型为phrase_suggest(即使用关键字标记器)。

    查询如下:

    http://localhost:8983/solr/collection0/suggest?q=peug&suggest.dictionary=suggest_cars
    

    【讨论】:

    • 这太棒了。有效!非常感谢 James :) 虽然我在字典和过滤器上做了一些不同的配置,因为视图和外观对我来说不是最佳的。但功能确实符合我的需要:)
    • 感谢詹姆斯,对于所有新手来说,这里的问题是两个不同字段的不同索引路径,在数据目录中,将创建具有相同名称的文件夹,无论对 indexpath 给出什么。如果使用相同的目录,则对于第二个组件 solr 将无法创建 write.lock 所需的文件 bcz
    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2017-07-28
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多