【问题标题】:Searching numeric data using Solr使用 Solr 搜索数值数据
【发布时间】:2014-01-08 08:29:25
【问题描述】:

我将 Solr 用于(一个不寻常的?)为数字数据提供排名结果的用例。/

  1. 假设我有一组对象 O {O1...On} 的记录集,并且对于这些对象中的每一个我都有多个测量值:例如粘度、孔隙率、渗透率等。

  2. 对于 On+1 对象,我需要搜索上述记录集以找到最“相似”的(沿着粘度、孔隙度、渗透率的多个维度)等。

  3. 由于记录集 O 是数亿条记录,因此实际上不可能针对每个相似性度量(例如余弦或 Minkowski)运行。我需要将结果集修剪为前 100 名左右的候选人,并且我正在使用 Solr 运行查询。

我使用 On+1 对象的参数运行范围查询,例如[9.5 TO 10.5] 之间的孔隙度,因此 +/-5% 的值,布尔查询将它们链接起来以获得匹配的排名列表。

我的问题:

  1. 是否有更好的方法来执行此操作并从 Solr 获得我可以使用的分数,也许是阈值。当前的范围查询方法得分似乎遵循阶梯函数,无济于事。

  2. 我能否以 text_general 格式保存数字并使用查询数字进行搜索? 由于 quert 字符串可能会运行很长时间,我不确定如何处理这个问题,也许使用 MLT?

有什么想法吗?或对其他工具包的建议来帮助解决上述问题?

【问题讨论】:

  • 这种相似性应该如何为最终用户工作?他们是否只能在结果本身中搜索相似的结果(例如,选择一个结果文档并获得相似性),还是应该同时提供将用作相似性基础的输入数据,或两者兼而有之?
  • 其实两者都是,即用户上传一个对象的值,我们提供一个结果集,他们也可以从中搜索相似的。

标签: database search solr search-engine numerical-methods


【解决方案1】:

理论

正如你所说,范围查询在这里无法用于评分...但它仍然是过滤初始索引的好方法。

一旦使用一些基本查询过滤(或不过滤)索引 - 我们可以应用自定义评分。

以下是一些关于如何实现自定义评分的一般示例: http://spykem.blogspot.com/2013/06/plug-in-external-score-to-solr.html


在实现自定义排序时 - CustomScoreProvider 可以接收以下参数:

  • 值步 - 降低分数的一步
  • 得分步骤 - 每当出现“值步骤”时,将分数降低该值
  • 最大附加分数 - “完美匹配”除了原生分数(来自常规搜索查询)外,还有该分数,非完美匹配将具有较低的(非负)值

每次字段值与查询值之间的距离扩大“值步”时,附加分数将降低“分数步”,从“最大附加分数”开始,直到达到零。

附加评分公式将如下所示(直到达到零):

Max additional score - ((|fieldValue - queryValue| / Value Step ) * Score Step)

示例

因此,例如,具有以下设置:

  • 值步长 = 0.1
  • 得分步长 = 0.01
  • 最大附加分数 = 1

对于某些字段(例如渗透性)具有以下索引值:

  • 3(用于 doc1)
  • 5(用于 doc2)
  • 6(用于 doc3)
  • 7(用于 doc4)
  • 99999999(用于 doc5)

如果初始搜索查询如下所示:

q={!nearestParser valueStep=0.1 scoreStep=0.01 maxStep=1}permeability:5

那么结果将如下所示(假设所有文档的初始分数相同 (1))

  • doc2(分数 - 2.0)
  • doc3(得分 - 1.9)
  • doc1(得分 - 1.8)
  • doc4(得分 - 1.8)
  • doc5(得分 - 1)

结论:

  • Doc2 将获得最高分,因为它是完美匹配
  • Doc3 将是第二个,因为它尽可能接近(没有完美匹配)到首选输入(并且在得分距离内)
  • Doc1 和 doc4 将具有相同的分数,因为它们与初始搜索查询的距离相同。
  • Doc5 将具有初始分数,因为它超出了被视为“相似”的范围

我会尝试举一些实际的例子,但由于这需要一些时间,我认为现在回答这个想法会更好。


其他可能的解决方案

在阅读了NumericRangeQuery 之后,我还想到了使用 Trie* 字段结构(具体来说 - 利用它有效处理数字范围搜索的能力)以便从索引中找到最接近的值......但没有还没想好怎么做。

这可能会更高效,但要复杂得多……而且 Trie* 结构仍有可能无法处理此类操作……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 2011-12-20
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2015-10-03
    • 2011-08-28
    相关资源
    最近更新 更多