2

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

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

我可以看到两种方法来尝试解决这个问题,但我都遇到了问题。

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

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

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

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

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

谢谢。

4

1 回答 1

1

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

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

对于查询字符串查询:

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

为他人:

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

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

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

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

除了term查询,支持boost的查询还有很多,比如prefixquery、matchquery。您可以在某些情况下使用它。以下是一些官方示例: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"
        }
    }
]
}

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

于 2014-09-01T11:09:35.113 回答