2012-11-05 121 views
4

我有一个约100000个项目的索尔索引。 索引的一个字段是一个范围从0到INT_MAX的整数(实际上索引中的最高值是157)。我尝试做这个领域的范围查询,我得到很奇怪的结果:SOLR范围查询的奇怪行为

范围查询:

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

完全匹配的查询:

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

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

这是什么问题?我的索引是否可以被破坏?

谢谢。

+0

那么'[* TO 10]'的结果是什么呢?我想知道范围查询语法本身没有问题(例如,不会将空格编码为'%20')。 – raina77ow

+0

[* TO 10]给出了很好的结果(约57000项,反映了球场上的分布) –

回答

4

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

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

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

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

Documentation: -

编码 “整数” 值作为简单 串的传统数字字段类型。除了包含索引为字符串的数字值的现有 索引的人员之外,不应使用此类。新模式 应该使用TrieIntField。

字段值将数字进行排序,但范围查询(和其他 功能依赖于数值范围),将不能按预期: 值将Unicode字符串命令,而不是数字顺序进行评估。

+0

好吧,听起来很有趣。我会尽快检查。更改字段类型时是否必须重建索引? –

+0

是......需要重新索引。 – Jayendra

+0

将字段类型从整数更改为sint,解决了问题。谢谢。 –

-1

使用“int”类型,范围查询将正常工作。

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

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