【问题标题】:How to ignore whitespaces on solr query如何在 solr 查询中忽略空格
【发布时间】:2016-05-10 14:36:05
【问题描述】:

我在 Solr 上有名称 Audioslave 索引,我想将该文档与查询字符串 Audio Slave 匹配。

我配置了以下规则:

<fieldType name="text_filter" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory"
            catenateWords="1"
            catenateNumbers="1"
            catenateAll="1"
            preserveOriginal="1"
            generateWordParts="1"
            generateNumberParts="1"/>
    <filter class="solr.TrimFilterFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory"
            catenateWords="1"
            catenateNumbers="1"
            catenateAll="1"
            preserveOriginal="1"
            generateWordParts="1"
            generateNumberParts="1"/>
    <filter class="solr.TrimFilterFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
</fieldType>

还有一个使用它的字段:

<field name="artist_name_filter"  type="text_filter"  multiValued="false" indexed="true" stored="true" required="false" />

使用 Solr 分析工具时,一切看起来都很好。

查询部分如下:

  • KeywordTokenizerFactory 生成Audio Slave
  • 然后 WordDelimiterFilterFactory 将其拆分为 Audio SlaveAudioAudioSlaveSlave(让我们只使用此处的第三列 (AudioSlave)。
  • TrimFilterFactory 将其保留为AudioSlave
  • 最后将LowerCaseFilterFactory改成audioslave

另一方面,索引部分是:

  • KeywordTokenizerFactory 生成Audioslave
  • 然后 WordDelimiterFilterFactory 和 TrimFilterFactory 将其保持为Audioslave
  • 最后将LowerCaseFilterFactory改成audioslave

所以两个字段应该匹配,但是查询没有返回结果:

http://localhost:8983/solr/search_api/select?defType=edismax&amp;fq=type:Artist&amp;q=Audio%20slave&amp;qf=artist_name_filter&amp;wt=json

【问题讨论】:

    标签: search solr lucene


    【解决方案1】:

    您的问题不是分析,而是 QueryParser 语法。空格用于分隔查询子句,不受分析器的影响。当你有q=Audio slave时,它首先应用查询语法规则,并将其分成子句“音频”和“从属”,然后分别分析每个子句。

    我相信逃离空间应该可以完成工作:q=Audio\ slave

    这里的短语查询似乎应该可以工作,例如q="Audio slave",但它没有。它会生成类似:"(audio slave audio audioslave) slave" 对我来说,这是有问题的。

    【讨论】:

      【解决方案2】:

      尝试使用WhitespaceTokenizerFactory 作为索引部分的标记器。 这里KeywordTokenizerFactory 保持文本原样......它不会创建任何标记。

      将其替换为WhitespaceTokenizerFactoryWhitespaceTokenizerFactory 将在空间创建令牌。

      【讨论】:

      • 他们的分析是使用WordDelimiterFilter来创建单独的token,而不是Tokenizer。
      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多