3

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

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

谢谢萨尔

4

2 回答 2

2

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

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

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

于 2013-10-19T17:05:06.213 回答
1

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

这是我能想到的。

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

看看这个组件:术语向量组件

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

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

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

于 2013-10-22T04:44:24.677 回答