【问题标题】:Is there a way to implement a IntRangeField in Solr?有没有办法在 Solr 中实现 IntRangeField?
【发布时间】:2012-02-29 16:30:42
【问题描述】:

全部!这是我可怕的案例,谢谢你的帮助! 我想要这样的文件:

<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 不支持这一点。

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

费德里科

【问题讨论】:

  • 为什么要避免这种情况?
  • 因为它很大并且使我的文档比应有的要重得多。假设我有一个从 1 到 100 的范围,如果我可以将其设置为一个值而不是 100 会更好,对吧?
  • 在结果中使用fl parameter 来指定您不想要/不需要occupiedDays 的值似乎会更好。
  • 但是它仍然对索引很重,这不是响应速度慢的问题,而是当我尝试存储一个非常大的范围时,即使它有 1024M,solr 也会抛出 OutOfMemory 错误分配给它的 ram。所以这就是为什么我试图降低提交文件的大小
  • 我明白了。存储startend?然后查询start:[5 TO *] AND end:[* TO 30] ?

标签: java solr solrj


【解决方案1】:

其实你没有太多选择:

  • 要么你需要这个字段来进行搜索,在这种情况下映射需要是显式的(Lucene/Solr 是一个倒置索引,这意味着对于每个单独的字段实例,它存储包含该字段实例的文档列表),

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

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

【讨论】:

  • 我需要这个字段进行搜索!确实与您与我共享的链接上发布的问题相似。但我不知道,也没有找到太多关于如何在 Solr 上实现新的 FieldType 并部署它的文档。我也在这里发布了同样的问题:lucene.472066.n3.nabble.com/…
  • 您需要做的就是编写一个扩展 FieldType lucene.apache.org/solr/api/org/apache/solr/schema/… 的类,然后在您的 schema.xml 中声明它( ) 并将您的 fieldType 定义用于某些字段 ()。您的 MyFieldType 类需要打包在核心 lib 目录中的 Jar 中(如果您使用多核设置,则在 sharedLib 中)。
  • 这很公平,我知道如何拉那个,但我怎样才能让 Solr 知道该类应该如何过滤?
  • 您需要覆盖 getFieldQuery 和 getRangeQuery,具体取决于您是过滤单个值还是范围。
  • 就这样?我不敢相信这很容易:|。不过我会试一试的!
【解决方案2】:

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

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

【讨论】:

  • 我不确定我是否得到您的解决方案,如何将我的数据预处理到存储桶中?感谢回复!另外,我的 solr 数据库实际上并不是很大,现在它保存了 4/5k 的文档,这些文档并不是很大,并且只有在尝试提交范围很广的文档时才会抛出 OOM。
  • 很抱歉,我只是不明白这种方法是如何工作的。我可以有 23423-9999 的水桶吗?因为你看到的那些数字是天,所以我会像这样在 solr 中输入它们:20120311 20120312 ...
  • 您的示例显示数字 1 到 10 和 5 到 15。如果您的示例不正确,那么人们将无法理解您的问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2012-12-18
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多