我在Solr中定义了一个动态TextField:
<dynamicField name="*" type="text" indexed="true" stored="true" omitTermFreqAndPositions="true" omitNorms="true" docValues="false" multiValued="false"/>
<fieldType name="text" class="solr.TextField"/>
如果我对这些字段进行范围查询,则会找到索引中的每个文档,甚至那些不在范围内的文档。DebugQuery显示范围查询在内部更改为“{to}”:
"debug":{
"rawquerystring":"Format.Typ:[X TO Y]",
"querystring":"Format.Typ:[X TO Y]",
"parsedquery":"SolrRangeQuery(Format.Typ:{* TO *})",
"parsedquery_toString":"Format.Typ:{* TO *}",
"explain":{
"$UTILMD&5.2c&3ced6800-1262-11ed-a3af-00155d639d26":"\n1.0 = Format.Typ:{* TO *}\n"},
...
Solr文档说明范围搜索应适用于所有类型的字段:https://solr.apache.org/guide/8_11/the-standard-query-parser.html#range-搜索
如果我将字段定义为StrField,它就可以正常工作。为什么查询会更改,我该如何使其与TextFields一起工作?
1条答案
按热度按时间jgwigjjp1#
您需要在fieldType定义中定义analyzer。
分析器检查字段的文本并生成令牌流。
请注意,分析链同时对正在索引的文本和正在查询的文本进行操作。您可以为这两者定义一个分析器,也可以为每种定义一个特定的分析器。
尽管存在默认的分析器回退,但它不允许做很多事情。更准确地说,应该为文本字段定义tokenizer,使其按“预期”工作,否则使用textField根本没有意义。
即使是Keyword标记化器,它只将整个流视为单个标记,也应该使范围查询能够正常工作:
编号:。上述相当于:
应用更改后,您必须删除所有“文本”字段的内容并重新加载核心,然后才能再次索引和查询这些字段。