范围查询不适用于Solr中的TextFields

atmip9wb  于 2022-10-21  发布在  Solr
关注(0)|答案(1)|浏览(218)

我在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一起工作?

jgwigjjp

jgwigjjp1#

您需要在fieldType定义中定义analyzer
分析器检查字段的文本并生成令牌流。
请注意,分析链同时对正在索引的文本和正在查询的文本进行操作。您可以为这两者定义一个分析器,也可以为每种定义一个特定的分析器。
尽管存在默认的分析器回退,但它不允许做很多事情。更准确地说,应该为文本字段定义tokenizer,使其按“预期”工作,否则使用textField根本没有意义。
即使是Keyword标记化器,它只将整个流视为单个标记,也应该使范围查询能够正常工作:

<fieldType name="text" class="solr.TextField">
  <analyzer class="org.apache.lucene.analysis.core.KeywordAnalyzer"/>
</fieldType>

编号:。上述相当于:

<fieldType name="text" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
  </analyzer>
</fieldType>

应用更改后,您必须删除所有“文本”字段的内容并重新加载核心,然后才能再次索引和查询这些字段。

相关问题