Solr Query - 计算术语的平均位置

时间:2013-10-14 19:07:24

标签: solr lucene solr4 solrcloud

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

接下来,我需要计算查询中所有文档中术语的平均位置。有了这个,我不需要将文档主题文本返回给客户端 - 只需要平均术语位置。

由于 萨尔

2 个答案:

答案 0 :(得分:2)

其中一个解决方案是执行以下操作 (很多编码 - 我不知道你需要遍历文档中的术语位置的快捷方式。没有通过函数执行此操作的内置功能,但您也可能会想到以某种方式使用Payloads。) / p>

  1. 创建自己的查询类型,扩展基本的TermQuery。
  2. 对于TermsQuery,评分逻辑归结为遍历使用您的术语创建的TermsEnum对象。您可以使用DocsAndPositionsEnum枚举每个文档中特定术语的所有位置。
  3. 我假设你不关心Lucene相似度计算(对吗?)。然后,您可以将特定文档中的平均位置返回为“得分”
  4. 棘手的部分是在整个集合中返回平均信息而不返回文档本身。 我会尝试使用StatsComponent,它返回结果集中某个字段的基本统计信息。我不知道它是否可以与“得分”字段或任何其他计算字段一起使用。 如果没有,请尝试更改QueryComponent以计算平均值并将其设置为结果而不是文档。 如果您希望在集群中运行此事物(分布式搜索),则还必须覆盖分布式查询行为,以便计算所有分片的平均值。
  5. 也许另一种选择是改变索引逻辑并在分析阶段计算这些平均值。如果您设法这样做(将其放入有效负载),您可以在查询时间内更快地获取此信息,但这意味着开发一个复杂的分析过滤器。

答案 1 :(得分:1)

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

这是我能想到的。

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

看一下这个组件:The Term Vector Component

  • 提供您的查询
  • 供应tv.positions = true。
  • Solr rows parameter
  • 中提到的那样提供rows = veryBigNumber

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

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

确保您检索所需的最少内容。如果您最终收到大量噪音,您可以随时将此组件自定义为Solr Plugin,并仅返回您需要的信息。