我正在尝试使用Solr的建议器组件实现搜索的自动完成功能。我想在多个领域提出建议。我有2个字段taxonomy
和tag
,我想在建议中提供这些字段。例如,如果搜索查询是neck
,那么它应该返回:
necklace
neckalce sets
pearl necklace
diamond necklace
pearl necklace sets
diamond necklace sets
其中necklace
是分类,pearl
和diamond
是标记。
以下是我的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
。
答案 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>