我的架构中有两个字段:
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
查询时
在deugging模式下,它显示其制作查询如
rawquerystring :hello world
querystring :你好世界 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)()
我的期望是这样的:
预期 :+(((field1:hello world)((field2:hello)(field2:world))~1)()
即对于field1
,它不应该破坏空间查询,因为它使用关键字tokenizer,而它应该打破field2
的空间查询。
你能告诉我我做错了什么吗?
答案 0 :(得分:2)
您需要在查询中转义空格(使用反斜杠或术语周围的引号) - 查询解析器不会根据每个字段的分析器/标记器进行解析。