【问题标题】:Elasticsearch sort on multiple queriesElasticsearch 对多个查询进行排序
【发布时间】:2014-09-24 17:39:12
【问题描述】:

我有一个这样的查询:

{
    "sort": [
        {
            "_geo_distance": {
                "geo": {
                    "lat": 39.802763999999996,
                    "lon": -105.08748399999999
                },
                "order": "asc",
                "unit": "mi",
                "mode": "min",
                "distance_type": "sloppy_arc"
            }
        }
    ],
    "query": {
        "bool": {
            "minimum_number_should_match": 0,
            "should": [
                {
                    "match": {
                        "name": ""
                    }
                },
                {
                    "match": {
                        "credit": true
                    }
                }
            ]
        }
    }
}

我希望我的搜索始终返回所有结果,只是与那些匹配标志更接近顶部的结果进行排序。

我希望排序优先级类似于:

  1. searchTerm(名称,字符串)
  2. 标志(信用/atm/ada/等,布尔值)
  3. 距离

如何做到这一点?

到目前为止,您在上面看到的查询就是我得到的全部信息。我无法弄清楚如何始终返回所有结果,也无法弄清楚如何将其他查询合并到排序中。

【问题讨论】:

  • 您的要求有点混乱。您说“具有匹配标志的那些”应该“更接近顶部”。但是您的排序优先级将“名称”作为最高排序标准。那么,它应该首先找到所有匹配的名称,然后考虑匹配标志的数量(匹配标志越多越好)?假设您要搜索银行分行 - 您希望名称与分行具有“信用”功能、“自动取款机”功能的事实相匹配?或者您想找到具有“好”名称和一些“好”功能的分支?意味着名称和这些功能有多重要?

标签: node.js sorting elasticsearch search-engine


【解决方案1】:

实际上,我不相信“排序”是您正在寻找的答案。我相信您需要一种试错法,从一个简单的“布尔”查询开始,您可以在其中放置所有标准(名称、标志、距离)。然后你给你的名字标准更多的权重(提升)然后少一点你的标志,甚至更少的距离计算。

“布尔”“应该”能够根据每个标准的 _score 为您提供一个排序的文档列表,并且根据您对每个标准的评分方式,_score 或多或少会受到影响。

此外,返回所有元素并不困难:只需将 "match_all": {} 添加到您的“布尔”“应该”查询中。

从我的角度来看,这将是一个起点,并且根据您的文件和您的要求(请参阅我对您的帖子关于混淆的评论),您需要调整“提升”值并测试、调整再次测试等:

{
  "query": {
    "bool": {
      "should": [
        { "constant_score": {
            "boost": 6,
            "query": {
              "match": { "name": { "query": "something" } }
            }
        }},
        { "constant_score": {
            "boost": 3,
            "query": {
              "match": { "credit": { "query": true } }
            }
        }},
        { "constant_score": {
            "boost": 3,
            "query": {
              "match": { "atm": { "query": false } }
            }
        }},
        { "constant_score": {
            "boost": 3,
            "query": {
              "match": { "ada": {  "query": true } }
            }
        }},
        { "constant_score": {
            "query": {
              "function_score": {
                "functions": [
                  {
                    "gauss": {
                      "geo": {
                        "origin": {
                          "lat": 39.802763999999996,
                          "lon": -105.08748399999999
                        },
                        "offset": "2km",
                        "scale": "3km"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "match_all": {}
        }
      ]
    }
  }
}

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2014-04-07
    相关资源
    最近更新 更多