【问题标题】:Solr Query - Calculating average position of a termSolr Query - 计算术语的平均位置
【发布时间】:2013-10-14 19:07:23
【问题描述】:

给定一个查询和一个词,我如何计算该词在查询中每个文档中的平均位置并返回它? 我正在寻找最快(性能方面)的解决方案并愿意扩展 solr 功能。

然后,我需要计算一个词在查询中所有文档中的平均位置。有了这个,我不需要将文档主题级别返回给客户 - 只是平均术语位置。

谢谢 萨尔

【问题讨论】:

  • 请用示例定义“词的平均位置”。
  • 假设我们必须文档:你好,我的名字是 phani,你好,我的父母叫我 phani,那么“my”这个词在这些文档集中的平均位置是 (2+7)/2

标签: solr lucene solr4 solrcloud


【解决方案1】:

解决方案之一是执行以下操作 (相当多的编码 - 我不知道快捷方式,因为您需要遍历文档中的术语位置。没有通过函数执行此操作的内置功能,但您也可能会考虑以某种方式使用有效负载)。

  1. 创建您自己的查询类型,扩展基本的 TermQuery。
  2. 对于 TermsQuery,评分逻辑归结为遍历使用您的术语创建的 TermsEnum 对象。您可以使用 DocsAndPositionsEnum 枚举每个文档中特定术语的所有位置。
  3. 我假设您不关心 Lucene 相似度计算(是吗?)。然后,您可以简单地将特定文档中的平均位置作为“分数”返回
  4. 棘手的部分是返回整个集合的平均信息,而不返回文档本身。 我会尝试使用 StatsComponent,它返回结果集中某个字段的基本统计信息。我不知道它是否可以与“分数”字段或任何其他计算字段一起使用。 如果不是,请尝试更改 QueryComponent 以计算平均值并将其设置为结果而不是文档。 如果您希望在集群中运行这个东西(分布式搜索),您还必须覆盖分布式查询行为,以便计算所有分片的平均值。

也许另一种选择是更改索引逻辑并在分析阶段计算这些平均值。如果您设法这样做(将其放入有效负载中),您可以在查询时间内更快地获取此信息,但这意味着开发一个复杂的分析过滤器。

【讨论】:

    【解决方案2】:

    如果我对您的理解正确,您想计算一个术语在为特定查询返回的文档集中的所有位置的算术平均值。

    这是我能想到的。

    首先,您必须在索引时启用positional information 以从索引中提取任何位置信息。

    看看这个组件:The Term Vector Component

    • 提供您的查询
    • 提供 tv.positions=true。
    • Solr rows parameter 中所述,提供 rows=veryBigNumber

    响应将包含计算算术平均值所需的内容。

    请不要忘记在查询中指定您要查找的字词。 例如:q:(field1:someExQueryIfNeeded AND field2:targetTerm)

    确保您检索到的东西最少。如果您最终收到很多噪音,您始终可以将此组件自定义为 Solr Plugin 并仅返回您需要的信息。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2020-03-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多