Solr没有逃脱用于搜索的空格

时间:2017-08-09 06:11:30

标签: solr

我使用版本为6.4.1的Solr服务器。

我需要搜索可能包含-_.等规范符号的字段。但与此同时,我需要有机会找到没有这些符号的实体。

例如,值为G2-5SG。我应该在接下来的查询中找到它:G2 5SGG2-5SGG25SG

我有以下类型的配置:

    <analyzer type="index">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\w+)([-_.\s])" replacement="$1"/>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="16"/>
    </analyzer>
    <analyzer type="query">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\w+)([-_.\s])" replacement="$1"/>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>

使用规范符号搜索工作正常。但是当我尝试在没有符号的情况下搜索单词时,服务器返回一个空集。

对于索引G2 5SG和查询G25SG,分析器中的值被标记为令人满意。

2 个答案:

答案 0 :(得分:1)

有一件事可行:

  • 使用copyfield使两个字段以相同的文本提供,但分析方式不同
  • 您使用所需符号保留的一个字段,可能只是小写,并使用KeywordTokenizerFactory
  • 第二个字段类似,但删除所有此类字符,只留下字母数字值
  • 现在您使用edismax解析器在两个字段中进行搜索。此外,你可以给第一个字段增加更多的权重,这比第二个字段更“真实”。因此,您将获得更高的相关性

答案 1 :(得分:0)

您可以使用

<tokenizer class="solr.StandardTokenizerFactory"/>

此标记生成器将文本字段拆分为标记,将空格和标点符号视为分隔符。

而不是

<tokenizer class="solr.KeywordTokenizerFactory"/>

此标记生成器将整个文本字段视为单个标记。

您可以尝试下面的内容。

<fieldtype name="subword" class="solr.TextField">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.WordDelimiterFilterFactory"/>
      <filter class="solr.FlattenGraphFilterFactory"/> 
    </analyzer>
    <analyzer type="query">
           <tokenizer class="solr.KeywordTokenizerFactory"/>
    </analyzer>
</fieldtype>

有关详细信息,请参阅标记程序页面Tokenizers