例如,搜索:分点
应匹配
无需匹配“点分”。
我尝试在solr6.0中使用NGramFilterFactory,但总是得到匹配顺序相反的结果。 像这样:
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="25"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
我尝试使用PatternReplaceFilterFactory将空格替换为*。但是它不起作用,只将它作为字符串匹配。
答案 0 :(得分:0)
由于您只想匹配前缀,因此无需使用NGramFilter即可实现所需:
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
..然后使用通配符查询:
field:cent*
由于KeywordTokenizer将输入保持为单个大型令牌,并且您已将其降低(小写过滤器在执行通配符搜索时也起作用),因此您可以避免为每个值索引大量令牌(这是当你只关心值的前缀时,ngramfilter会做什么。
对于你的第二个要求 - 顺序 - 精确匹配提升得更高,在没有ngram过滤器的情况下查询更简单的字段定义 - 只是一个空格标记器和一个小写过滤器。您可以使用前缀查询作为返回文档的查询,然后使用其他字段作为提升查询。
根据#2和#3之间差异的规则,您可能需要调整提升查询以获得所需的顺序。
答案 1 :(得分:0)
1)分点
2)centrepoint
3)中心点
要解决1和3,并保持位置重要,我建议只使用短语查询和边缘ngram索引时间分析:
<fieldType name="text_autocomplete" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="0"
catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="2"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="0"
catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
对于第2点,由于索引中有一个复合令牌,Solr不知道它由2个单词组成,因此更难。
你可以看看这个拼写检查器[1],它可能有帮助
[1] https://lucene.apache.org/solr/guide/6_6/spell-checking.html#SpellChecking-WordBreakSolrSpellChecker