【问题标题】:Weird behavior of SOLR range querySOLR 范围查询的奇怪行为
【发布时间】:2015-10-12 19:02:17
【问题描述】:

我有一个包含大约 100000 个项目的 solr 索引。 索引的一个字段是一个整数,范围从 0 到 INT_MAX(实际上索引中的最大值是 157)。我尝试对这个字段进行范围查询,结果很奇怪:

范围查询:

  • nb_validations:[10 TO *] => 返回 40499 项
  • nb_validations:[9 TO *] => 返回 6 个项目(应该至少 40499 ??!!
  • nb_validations:[8 TO *] => 返回 13 个项目

完全匹配查询:

  • nb_validations:10 => 返回 2005 个项目
  • nb_validations:9 => 返回 6 个项目

我的日志中没有错误,我的 solr 配置看起来还不错。字段被声明为 int 并被索引和存储。

这有什么问题?我的索引会损坏吗?

谢谢。

【问题讨论】:

  • 那么[* TO 10] 的结果是什么?我想知道范围查询语法本身是否存在问题(例如,不将空格编码为%20)。
  • [* TO 10] 给出了很好的结果(大约 57000 个项目,这反映了场上的分布)

标签: solr


【解决方案1】:

您应该使用sint 来存储值并将该字段用于范围查询。

<field name="age" type="sint" indexed="true" stored="true"/>

如果字段类型为整数,Solr 仍可能将其视为字符串。

<field name="age" type="integer" indexed="true" stored="true"/>

Documentation:-

将“整数”值编码为简单的旧数字字段类型 字符串。除非有现有的人,否则不应使用此类 包含索引为字符串的数值的索引。新模式 应该使用 TrieIntField。

字段值将按数字排序,但范围查询(和其他 依赖数字范围的功能)将无法按预期工作: 值将按 unicode 字符串顺序计算,而不是数字顺序。

【讨论】:

  • 好吧,听起来很有趣。我会尽快检查的。更改字段类型时是否必须重建索引?
  • 将字段类型从整数更改为 sint,解决了问题。谢谢。
【解决方案2】:

使用“int”类型,范围查询就可以了。

<field name="my_name" type="int" indexed="true" stored="false"/>

<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2014-09-24
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多