我的架构中有两个字段:
field1
正在使用keyword
分词器过滤器来保留代币(甚至不划分空间。我在分析选项卡中仔细检查了它。
field2
正在使用WhitespaceTokenizerFactory
来破坏空格和制表符等上的单词。
<field name="field1" type="field1_type" indexed="true" stored="false"/>
<field name="field2" type="field2_type" indexed="true" stored="false"/>
<fieldType name="field2_type" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory" /> </analyzer> <analyzer type="query"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory" /> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> </analyzer> </fieldType>
我正在使用默认edismax
qf
值= field1
field2
的解析器
现在当我用q=hello world
查询时
在去刨模式下,它显示它的查询像
原始查询字符串 :Hello World
查询字符串 :你好世界 parsedquery:(+((DisjunctionMaxQuery((field1:hello | field2:hello)) DisjunctionMaxQuery((field1:world | field2:world)))~1) ())/no_coord
parsedquery_toString:+(((field1:hello | field2:hello) (field1:world | field2:world))~1) ()
我所期望的是这样的:
预期 :+((字段 1:hello world) ((字段 2:hello) (字段 2:world))~1) ()
即对于field1
,它不应该破坏对空间的查询,因为它正在使用关键字分词器,而它应该中断对空间的查询field2
。你能说出我做错了什么吗?
您需要转义查询中的空格(在术语周围使用反斜杠或引号) - 查询解析器不会根据每个字段的分析器/分词器进行分析。