【问题标题】:Rails elasticsearch _geo_distance and custom scoring/sortingRails elasticsearch _geo_distance 和自定义评分/排序
【发布时间】:2014-10-24 16:26:42
【问题描述】:

所以我的 Rails 应用程序使用 elasticsearch(带有 searchkick),使用 _geo_distance 排序功能工作得很好,但是我需要做一个更复杂的排序,包括位置和尝试促进企业名称精确字符串匹配。

例如,如果我进行查询并且有 10 个升序距离返回结果,但 #5 结果也是记录中商家名称的精确字符串匹配,我想将其提升/提升到 # 1 个位置(基本上覆盖了该记录的距离排序)。

我可以通过两种方法尝试解决此问题,但我都遇到了问题。

首先,将在初始查询上执行此操作,以便弹性搜索处理工作。

其次,将对elasticsearch返回的结果进行某种类型的后处理重新排序,以查找完全匹配并在需要时重新排序。

第一种方法的问题是,在调用 _geo_distance 时,内置评分机制似乎完全转移到距离,这让我想知道如何将自定义评分函数与位置混合。

第二种方法的问题是返回的搜索结果是自定义类型的 SearchKick 对象,它似乎不像后处理的普通数组或哈希排序机制。

有没有办法在查询前或查询后以这种方式在结果中提升文档?

谢谢。

【问题讨论】:

    标签: ruby-on-rails elasticsearch geo searchkick


    【解决方案1】:

    其实,有很多方法可以“控制”得分。在索引之前,如果您已经有一些文档是为了获得高分/提升。索引前可以给特殊文档打高分,请参考here

    如果在索引之前无法确定boost,可以在查询命令中boost。关于 boosting 查询,也有很多选项,这取决于您使用的查询类型。

    查询字符串查询:

    您可以提升某些字段,例如fields" : ["content", "name.*^5"],或提升某些查询命令,例如quick^2 fox(这可能对您有用,只是额外提升名称)。

    对于其他人:

    你可以给term查询加boost,比如boosting "ivan" case:

    "term" : {"name" : {"value" : "ivan","boost" : 10.0}}

    您可以将其包装成 bool 查询并提升所需的情况。前任。查找所有“ivan”,在名称字段中提升“ji”。

    {“查询”:{“布尔”:{“必须”:[{“匹配”:{“名称”:“伊万”}}],
    “应该”:[{“术语”:{“名称”:{“价值”:“ji”,“提升”:10 }}}]}}}

    除了term查询,支持boost的查询还有很多,比如prefix查询,match查询。您可以在某些情况下使用它。下面是一些官方的例子:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_boosting_query_clauses.html

    提升对于控制分数可能并不容易,因为它需要标准化。您可以使用function_score 查询指定分数来指定直接分数:如果您需要更直接的控制,这确实是一个有用的查询。


    简而言之,您可以将查询包装在 bool 中并为名称匹配添加一些提升,如下所示:

    { "query" : {
        "bool" : {
        "must": [
                {"filtered" : {
                "filter" : {
                    "geo_distance" : {
                        "distance" : "2000km",
                        "loc" : {
                            "lat" : 10,
                            "lon" : 10
                        }
                    }
                }
            }}],
        "should" : [ { "term" : { "name": { "value" : "ivan", "boost" : 10 }}}]}},
    "sort" : [
                "_score",
        {
            "_geo_distance" : {
                "loc" : [10, 10],
                "order" : "asc",
                "unit" : "km",
                "mode" : "min",
                "distance_type" : "sloppy_arc"
            }
        }
    ]
    }
    

    更详细的可以查看我的要点https://gist.github.com/hxuanji/e5acd9a5174ea10c08b8。我提升了“伊万”的名字。结果,“ivan”文档成为第一个文档,而不是 (10,10) 文档。

    【讨论】:

    • 感谢您的回答,但我仍然不清楚此评分如何与地理距离评分/结果一起使用。地理结果​​按距离排序,这似乎改变了正常的评分功能。在这种情况下,提高“分数”会导致不正确的距离测量。那么如何保留地理测量值,同时仍然宣传文档?
    • 我想解决这个问题的另一种方法是让结果按 _score(不是地理)排序,但也在返回的结果中包含 _geo_distance 数据。但我也没有弄清楚如何做到这一点。
    • 我不确定这是否属于一个全新的问题,但有人知道如何将上面的示例查询转换为有效的SearchKick 查询吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2017-03-04
    • 2013-08-23
    相关资源
    最近更新 更多