如何在solr查询中忽略空格

时间:2016-05-10 14:36:06

标签: search solr lucene

我在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(我们只允许使用第3列(AudioSlave)。< / LI>
  • TrimFilterFactory将其保持为AudioSlave
  • 最后,LowerCaseFilterFactory将其更改为audioslave

另一方面,索引部分是:

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

因此两个字段都应匹配,但查询不返回任何结果:

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

2 个答案:

答案 0 :(得分:2)

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

逃离空间应该做的工作,我相信:q=Audio\ slave

这里的短语查询似乎应该有效,例如q="Audio slave",但事实并非如此。它会为我生成类似"(audio slave audio audioslave) slave"的内容,这是有问题的。

答案 1 :(得分:0)

尝试将WhitespaceTokenizerFactory用作索引部分的标记器。 这里KeywordTokenizerFactory保留文字原样......它不会创建任何代币。

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