有没有办法在Solr中实现IntRangeField?

时间:2012-02-27 20:49:57

标签: java solr solrj

全部!这是我可怕的案子,谢谢你的帮忙! 我想要一份这样的文件:

<doc>
    ...
    <arr name="occupiedDays"> -- multivalued range field
         <range>1 TO 10</range>
         <range>5 TO 15</range>
    </arr>
    ...
</doc>

我之所以这么做是因为它比拥有所有数字要轻得多,当然。 为了清楚起见,我想避免在solr中使用它:

<doc>
    ...
    <arr name="occupiedDays"> -- multivalued int field
         <str>1</str>
         <str>2</str>
         <str>3</str>
         <str>4</str>
         <str>5</str>
         <str>6</str>
         <str>7</str>
         <str>8</str>
         <str>9</str>
         <str>10</str>
    </arr>
    ...
</doc>

然后对此范围字段执行范围查询,例如:fq = -occupiedDays:[5 TO 30]

有人有任何想法吗?我在互联网上询问和搜索,似乎solr不支持这个。

任何帮助都会非常有用!谢谢你提前。

费德里科

2 个答案:

答案 0 :(得分:0)

实际上,你没有太多选择:

  • 要么搜索需要此字段,在这种情况下,映射需要是显式的(Lucene / Solr是反向索引,这意味着每个单个字段实例,它存储包含此字段实例的文档列表,

  • 您只需要存储这个字段,在这种情况下,我最好的建议是将其存储在Solr之外。

您的字段名称让我认为您正在开发一些可用性系统。您可能对此问题感兴趣:

答案 1 :(得分:0)

为什么不将数据预处理到存储桶中,只将最终结果提交给SOLR。定义固定数量的存储桶,一次增加10个,再加上一个额外的存储桶,用于超出该范围的数量。例如,你可以有3个10个桶,分别是1-10,11-20,21-30和31个或更多。然后,通过将ocuppiedDays落入桶中的每个记录增加一个桶来计算每个桶中的记录,或者通过将每个记录的occupiedDays添加到适当的桶中来总结天数。取决于您想要对数据做什么,正确的解决方案甚至可以在不同的领域中以两种方式进行。

顺便说一句,1024M的RAM并不是一个很大的SOLR数据库。通常,SOLR将整个索引存储在RAM中,当您执行搜索查询时,它还会在RAM中缓存结果集的副本,其中包括结果集中的任何非索引字段。检查solrconfig.xml中的缓存配置,因为您可能缓存了太多数据。此外,如果您有大量未编制索引的字段,请考虑将该信息放在单独的键值存储中,以便它们不会占用RAM进行缓存。