【问题标题】:How to autocomplete across multiple fields in Solr如何在 Solr 中跨多个字段自动完成
【发布时间】:2024-04-25 22:20:02
【问题描述】:

我正在尝试使用 Solr 的建议器组件实现搜索的自动完成功能。我想提出跨多个领域的建议。我有 2 个字段 taxonomytag 我想在建议中提供。例如,如果搜索查询是neck,那么它应该返回:

necklace
neckalce sets
pearl necklace
diamond necklace
pearl necklace sets
diamond necklace sets

其中necklace 是分类,pearldiamond 是标签。

以下是我的 schema.xml:

<field name="suggestion" type="text_auto" indexed="true" stored="false" multiValued="false" />

<copyField source="taxonomy_name" dest="suggestion"/>
<copyField source="tag" dest="suggestion">

<fieldType name="text_auto" class="solr.TextField">
  <analyzer>
   <tokenizer class="solr.KeywordTokenizerFactory"/>
   <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

还有我的 solrconfig.xml:

<searchComponent class="solr.SpellCheckComponent" name="suggest">
<lst name="spellchecker">
  <str name="name">suggest</str>
  <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
  <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
  <str name="field">suggestion</str>  <!-- the indexed field to derive suggestions from -->
  <float name="threshold">0.005</float>
  <str name="buildOnCommit">true</str>
</lst>
</searchComponent>


<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
 <lst name="defaults">
   <str name="spellcheck">true</str>
   <str name="spellcheck.dictionary">suggest</str>
   <str name="spellcheck.onlyMorePopular">true</str>
   <str name="spellcheck.count">5</str>
   <str name="spellcheck.collate">true</str>
 </lst>
 <arr name="components">
   <str>suggest</str>
 </arr>
</requestHandler>

但这会返回:

necklace
necklace sets

我该如何解决这个问题。我也尝试过使用:

<fieldType name="text_auto" class="solr.TextField"> 
  <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="false"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer> 
</fieldType> 

但这只会返回necklace sets

【问题讨论】:

    标签: solr autocomplete search-suggestion


    【解决方案1】:

    仅当查询是第一个单词时,SolR 中的自动完成功能才有效。

    如果查询是“neck”,则自动完成应返回以“neck”开头的术语。 它不能返回“珍珠项链”,因为“珍珠”在您的查询之前。

    查看此链接以获得可能的解决方案: http://www.cominvent.com/2012/01/25/super-flexible-autocomplete-with-solr/

    【讨论】:

    • 有道理。那么,我可以返回 necklace pearl 之类的东西吗,我可以稍后再翻转。
    • 你应该翻转necklace pearl,但你不应该翻转necklace sets,所以你必须区分这两种情况(不是那么容易)
    【解决方案2】:

    将此添加到&lt;searchHandler&gt;

    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    

    这将使您也可以搜索pearl necklace,因为它可以识别单词/短语/字段中间的文本。

    【讨论】:

      【解决方案3】:

      你试过了吗?

      <fieldType name="text_auto" class="solr.TextField"
      positionIncrementGap="100">
      <analyzer>
      <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true"
      words="stopwords.txt" enablePositionIncrements="true" />
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      </analyzer>
      </fieldType>
      

      【讨论】:

      • 我试过这个,但我只得到necklacenecklaces。我是否只需要在 schema.xml 中进行更改,还是需要在 scema.all.xml 中进行相同的更改?
      最近更新 更多