Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 基于多个查询的Elasticsearch排序_Node.js_Sorting_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Search Engine - Fatal编程技术网 elasticsearch,search-engine,Node.js,Sorting,elasticsearch,Search Engine" /> elasticsearch,search-engine,Node.js,Sorting,elasticsearch,Search Engine" />

Node.js 基于多个查询的Elasticsearch排序

Node.js 基于多个查询的Elasticsearch排序,node.js,sorting,elasticsearch,search-engine,Node.js,Sorting,elasticsearch,Search Engine,我有这样一个问题: { "sort": [ { "_geo_distance": { "geo": { "lat": 39.802763999999996, "lon": -105.08748399999999 }, "order": "asc",

我有这样一个问题:

{
    "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
                    }
                }
            ]
        }
    }
}
我希望我的搜索总是返回所有结果,只是与那些匹配的标志更接近顶部的结果排序

我希望排序优先级如下所示:

  • searchTerm(名称、字符串)
  • 标志(信用/atm/ada/etc、布尔值)
  • 距离
  • 如何做到这一点

    到目前为止,你在上面看到的查询是我得到的全部。我不知道如何始终返回所有结果,也不知道如何将附加查询合并到排序中。

    事实上,我不相信“排序”是您想要的答案。我相信您需要一种尝试和错误的方法,从一个简单的“bool”查询开始,在这里您可以放置所有的标准(名称、标志、距离)。然后你给你的名字加上更多的权重(提升),然后给你的旗子加上更少的权重,甚至给距离计算加上更少的权重

    “bool”“should”可以根据每个标准的_分数为您提供一个文档排序列表,并且根据您对每个标准的评分方式,_分数或多或少受到影响

    此外,返回所有元素并不困难:只需在“bool”“should”查询中添加一个
    “match_ALL”:{}

    从我的观点来看,这将是一个起点,并且,根据您的文档和要求(请参阅我对您文章中关于混淆的评论),您需要调整“boost”值并进行测试,再次调整并再次测试,等等:

    {
      "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": {}
            }
          ]
        }
      }
    }
    

    你的要求有点混乱。你说“那些有匹配标志的”应该“更接近顶部”。但您的排序优先级将“名称”作为最高排序标准。因此,它应该首先找到所有匹配的名称,然后考虑匹配标志的数量(匹配标志越多越好)?假设你想搜索一家银行分行——你想让名称与该分行具有“信用”功能、“atm”功能这一事实更加匹配?或者您想找到具有“好”名称和一些“好”功能的分支?意思是名称和这些功能有多重要?