2014-08-31 77 views
2

所以我的Rails应用程序使用elasticsearch(与searchkick),使用_geo_distance排序函数工作得很好,但我需要做一个更复杂的排序,包括位置和尝试提升商家名称完全匹配字符串。Rails elasticsearch _geo_distance和自定义评分/排序

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

我有两种方法可以解决这个问题,但我遇到了两个问题。

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

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

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

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

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

谢谢。

回答

1

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

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

对于查询字符串查询:

可以提高某些领域,如fields" : ["content", "name.*^5"],或提高某些查询命令,例如,quick^2 fox(这可能为你工作,只是额外增加的名称)。

对于其他人:

你可以给提升为长期的查询,如助推“伊万”的情况:

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

,你可以把它包装成布尔查询和提升所需案件。恩。找到所有'ivan',在名称字段中提升'ji'。

{ “查询”:{ “布尔”:{ “必须”:[{ “匹配”:{ “名”: “伊万”}}],
“应该”:[{ “术语” :{“name”:{“value”:“ji”,“boost”:10}}}]}}}

除了术语查询,还有很多支持boost的查询,例如prefix查询,match查询。你可以在情况下使用它。这里有一些正式的例子:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_boosting_query_clauses.html

提升可能不容易控制分数,因为它需要规范化。您可以使用function_score查询来指定分数以指定直接分数:如果您需要更直接的控制,则这是一个非常有用的查询。


总之,你可以用你的查询在布尔和添加一些刺激的名称匹配,如下:

{ "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)文档。

+1

感谢您的回答,但是我仍不清楚这个评分如何与Geo距离评分/结果一起工作。地理位置结果按距离排序,似乎会改变正常的评分功能。在这种情况下,“分数”的提升会导致错误的距离测量。那么我怎样才能保存地理测量数据,并仍然推广文档? – kayatela 2014-09-01 17:13:43

+0

我想另一种方法来处理这个问题,就是让结果按_score(而不是geo)排序,但是在返回的结果中也包含_geo_distance数据。但我还没有想出如何做到这一点。 – kayatela 2014-09-01 18:18:46

+0

检查我的编辑上面,我给你一个例子。 – hxuanji 2014-09-02 03:21:07