使用Solr搜索数字数据

时间:2013-12-19 16:53:47

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

我正在使用Solr(一个不寻常的?)用例来提供数字数据的排名结果./

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

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

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

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

    我的问题:

    1. 有没有更好的方法来做到这一点,并从Solr获得我可以使用的分数,也许是阈值。当前范围查询方法得分似乎遵循步进功能而无益。

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

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

1 个答案:

答案 0 :(得分:2)

理论

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

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

以下是有关如何实施自定义评分的一些常规示例: 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(for doc1)
  • 5(for doc2)
  • 6(for doc3)
  • 7(for doc4)
  • 99999999(for 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 *结构仍有可能无法处理这种操作......