基于某些字段的ElasticSearch结果排序(相关分数)(增强)

时间:2019-09-23 18:37:34

标签: elasticsearch

我使用ElasticSearch 6.6。我的应用程序通过从不同数据源提取数据来构建ES索引。搜索未指定数据源。它只是建立一个类似的查询:

GET employerdata/_search
{ 
  "query": 
  { 
    "bool": {
      "must": [
          {  "match" : {"name" : {
        "query": "WALMART",
        "fuzziness": "3"
      }}},
          {  "match" : {"state" : "TX"}}
        ]
    } 
  }

}

有一个名为“ dataSource”的字段。但是,它不用于构建查询。但是,这是结果的一部分。基本上,我想在构建查询时隐式地使用此字段。例如,如果文档的“ dataSource”等于“ A”,则文档应位于结果集的顶部。换句话说,我想基于“ dataSource”字段来提高得分。但是,即使文档是其他“数据源”(例如“ B”)的索引,我仍然希望得到结果。

3 个答案:

答案 0 :(得分:1)

要添加到@ apt-get_install_skill答案的顶部。如果在查询时需要提升而不是建立索引。您可以使用function_score

GET employer/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
            "match": {
              "dataSource": "B"
            }
          },
          "weight": 2
        }
      ]
    }
  }
}

答案 1 :(得分:0)

看看可以添加到查询https://www.elastic.co/guide/en/elasticsearch/reference/6.6/mapping-boost.html)中的加速参数。您将此提升设置为字段的某些值(例如dataSource = A)。这不是一个筛选器(dataSource = B仍将返回),但是它增加了与查询匹配的特定文档的相关性。

答案 2 :(得分:0)

GET employerdata/_search
{ 
 "query": 
 { 
"function_score": {
  "query": {"bool": {
  "must": [
      {  "match" : {"beName" : {
    "query": "KROGER",
    "fuzziness": "3"
  }}},
      {  "match" : {"beZip" : "47119"}}
    ]
} },
  "functions": [
    { "filter": {"match": {"dataSource" : "eeo1"}},
      "random_score": { },
      "weight": 25
    }
  ]
} 

}

}