Database 使用Solr搜索数字数据

Database 使用Solr搜索数字数据,database,search,solr,search-engine,numerical-methods,Database,Search,Solr,Search Engine,Numerical Methods,我将Solr用于(一个不寻常的?)为数字数据提供排名结果的用例/ 假设我有一组对象O{O1…On}的记录集,对于这些对象,我有多个测量值:例如粘度、孔隙度、渗透率等 对于On+1对象,我需要搜索上面的记录集以找到最“相似”的(沿粘度、孔隙度、渗透率的多个维度)等 由于记录集O是数亿条记录,因此实际上不可能对每个记录运行一个相似性度量,如余弦或Minkowski。我需要将结果集删减到前100名左右的候选项,并使用Solr运行查询 我使用On+1对象的参数运行范围查询,例如孔隙率在[9.5到10.5

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

  • 假设我有一组对象O{O1…On}的记录集,对于这些对象,我有多个测量值:例如粘度、孔隙度、渗透率等

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

  • 由于记录集O是数亿条记录,因此实际上不可能对每个记录运行一个相似性度量,如余弦或Minkowski。我需要将结果集删减到前100名左右的候选项,并使用Solr运行查询

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

    我的问题是:

  • 有没有更好的方法来做到这一点,并从Solr获得分数,我可以使用,也许可以达到阈值。当前范围查询方法得分似乎遵循step函数,没有帮助

  • 我能否以文本形式保存这些数字,并使用查询数字进行搜索? 由于quert字符串可能会运行很长时间,我不确定如何处理这个问题,可能是使用MLT

  • 有什么想法吗?或者对其他工具包的建议,以帮助实现上述功能?

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

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

    下面是一些关于如何实施自定义评分的一般示例:


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

    • 值步骤-降低分数的步骤
    • 分数步-每当出现“值步”时,将分数降低该值
    • 最大附加分数-“完美匹配”将在本地分数(来自reqular搜索查询)之外具有该分数,非完美匹配将具有较低的(非负值)值
    每次字段值和查询值之间的距离按“值步”扩展时,附加分数将按“分数步”降低,从“最大附加分数”开始,直到它达到零

    额外的评分公式如下所示(直到它达到零):


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

    • 值步长=0.1
    • 分数步长=0.01
    • 最大附加分数=1
    对于某些字段(例如渗透率),具有以下索引值:

    • 3(对于doc1)
    • 5(用于doc2)
    • 6(用于doc3)
    • 7(用于doc4)
    • 999999999(用于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将具有初始分数,因为它超出了被视为“相似”的范围
    我将尝试给出一些实际的例子,但由于这需要一些时间,我认为现在最好用这个想法来回答


    其他可能的解决办法 在阅读了有关的内容后,我还想到了使用Trie*字段结构(具体地说,利用它高效处理数值范围搜索的能力),以便从索引中找到最接近的值。。。但我还没弄明白怎么做


    这可能会更有效,尽管更复杂。。。Trie*结构仍有可能无法处理此类操作…

    这种相似性对最终用户应该如何工作?他们只能在结果本身中搜索相似的结果(例如,选择一个结果文档并获得相似性),还是应该提供一个输入数据作为相似性的基础,或者两者兼而有之?实际上,两者都可以,即用户上传一个对象的值,我们提供一个结果集,从中他们也可以搜索相似的结果。
    q={!nearestParser valueStep=0.1 scoreStep=0.01 maxStep=1}permeability:5