如何配置Solr进行部分和前缀字匹配

时间:2017-11-13 02:13:18

标签: solr

例如,搜索:分点

应匹配

  1. 分点
  2. 中心点
  3. 中心点
  4. 无需匹配“点分”。

    我尝试在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将空格替换为*。但是它不起作用,只将它作为字符串匹配。

2 个答案:

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