我在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分析工具时,一切看起来都不错。
查询部分如下:
Audio Slave
,Audio Slave
,Audio
,AudioSlave
和Slave
(我们只允许使用第3列(AudioSlave
)。< / LI>
AudioSlave
audioslave
另一方面,索引部分是:
Audioslave
,Audioslave
audioslave
因此两个字段都应匹配,但查询不返回任何结果:
http://localhost:8983/solr/search_api/select?defType=edismax&fq=type:Artist&q=Audio%20slave&qf=artist_name_filter&wt=json
答案 0 :(得分:2)
您的问题不是分析,而是QueryParser语法。空格用于分隔查询子句,并且不受分析器的影响。如果有q=Audio slave
,它首先应用查询语法规则,并将其分为“音频”和“从属”子句,然后分别分析每个子句。
逃离空间应该做的工作,我相信:q=Audio\ slave
这里的短语查询似乎应该有效,例如q="Audio slave"
,但事实并非如此。它会为我生成类似"(audio slave audio audioslave) slave"
的内容,这是有问题的。
答案 1 :(得分:0)
尝试将WhitespaceTokenizerFactory
用作索引部分的标记器。
这里KeywordTokenizerFactory
保留文字原样......它不会创建任何代币。
将其替换为WhitespaceTokenizerFactory
。
WhitespaceTokenizerFactory
将在太空创建令牌。