如何在Solr中的多个字段中自动完成

时间:2013-11-26 12:24:23

标签: solr autocomplete search-suggestion

我正在尝试使用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

3 个答案:

答案 0 :(得分:1)

SolR中的自动填充仅在查询是第一个单词时才有效。

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

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

答案 1 :(得分:1)

将其添加到#!/bin/bash GLOBAL_VAR=0 hello() { echo "Hello World!" GLOBAL_VAR=3 return 2 } echo () { output=$*; } hello result=$? unset -f echo # this should output "2" echo "RESULT: '$result'" # this should output "Hello World!" echo "OUTPUT: '$output'" # this should output "3" echo "GLOBAL_VAR: '$GLOBAL_VAR'"

<searchHandler>

这样您也可以搜索<str name="lookupImpl">AnalyzingInfixLookupFactory</str> ,因为它可识别单词/短语/字段中间的文字。

答案 2 :(得分:0)

你试过吗?

<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>