首页 文章

Rails elasticsearch _geo_distance和自定义评分/排序

提问于
浏览
2

所以我使用elasticsearch(使用searchkick)的Rails应用程序使用_geo_distance排序函数工作得很好,但是我需要做一个更复杂的排序,包括位置和尝试提升商家名称的精确字符串匹配 .

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

我可以通过两种方式尝试解决此问题,但我遇到了两个问题 .

首先,将在初始查询中执行此操作,以便elasticsearch处理工作 .

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

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

第二种方法的问题是返回的搜索结果是一个自定义类型的SearchKick对象,它似乎不喜欢后处理的正常数组或哈希排序机制 .

有没有办法在查询前或查询后做一些事情以这种方式在结果中推广文档?

谢谢 .

1 回答

  • 1

    事实上,有很多方法可以得分 . 在编制索引之前,如果您已经有一些文档意味着获得高分/提升 . 您可以在编制索引之前为特殊文档提供高分,请参阅here .

    如果在索引编制之前无法确定增强,则可以在查询命令中对其进行增强 . 关于提升查询,还有很多选项,它取决于您使用的查询类型 .

    For query string query:

    您可以增加一些字段,例如 fields" : ["content", "name.*^5"] ,或者增加一些查询命令,例如 quick^2 fox (这可能适合您,只需额外提升名称) .

    For others:

    您可以为术语查询提供提升,例如提升“ivan”案例:

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

    你可以把它包装成bool查询并提升所需的大小写 . 恩 . 找到所有'ivan',在名字字段上提升'ji' .

    {“query”:{“bool”:{“must”:[{“match”:{“name”:“ivan”}}],“should”:[{“term”:{“name”:{ “ Value ”:“ji”,“提升”:10}}}]}}}

    除了术语查询之外,还有很多支持boost的查询,例如 prefix query, match query . 你可以在情况下使用它 . 以下是一些官方示例: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"名称 . 在结果中,"ivan"文档成为第一个而不是(10,10)文档 .

相关问题