我正在使用Solr(一个不寻常的?)用例来提供数字数据的排名结果./
假设我有一组对象O {O1 ... On}的记录集,并且对于每个对象,我有多个测量值:例如粘度,孔隙率,渗透率等
对于On + 1对象,我需要搜索上面的记录集以找到最“相似”(沿着粘度,孔隙度,渗透率等多个维度)等。
由于记录集O是数亿条记录,因此实际上不可能针对每个相似性度量标准运行,例如Cosine或Minkowski。我需要将结果集修剪为前100名候选人,我正在使用Solr来运行查询。
我使用On + 1对象的参数运行范围查询,例如孔隙率在[9.5到10.5]之间,因此+/- 5%的值,布尔查询链接它们以获得匹配的排序列表。
我的问题:
有没有更好的方法来做到这一点,并从Solr获得我可以使用的分数,也许是阈值。当前范围查询方法得分似乎遵循步进功能而无益。
我能否以text_general格式保留数字并使用查询号码进行搜索? 由于quert字符串可以运行很长时间,我不确定如何处理这个问题,也许使用MLT?
有什么想法吗?或其他工具包的建议,以帮助解决上述问题?
答案 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)
因此,例如,进行以下设置:
具有某些字段的以下索引值(例如渗透率):
如果初始搜索查询如下所示:
q={!nearestParser valueStep=0.1 scoreStep=0.01 maxStep=1}permeability:5
那么结果会是这样的(假设所有文档的初始分数相同(1))
结论:
我会尝试提供一些实际的例子,但由于需要一些时间,我现在应该更好地回答这个想法。
在阅读NumericRangeQuery后,我也想到了使用Trie *字段结构(具体来说 - 利用它有效处理数值范围搜索的能力),以便从索引中找到最接近的值...但是还没想出怎么做。
这可能会更高效,但更复杂......而且Trie *结构仍有可能无法处理这种操作......