根据Elasticsearch中的最佳字段匹配进行搜索

时间:2018-05-02 15:25:35

标签: elasticsearch search full-text-search

在下面的文档中搜索“foo bar”会得到name*的累积结果,但我希望获得最匹配字段的分数(即name1分数)。

{
  "name1": "foo bar",
  "name2": "foo",
  "name3": "bar"
}

查询例如:

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "should": [{
            "match": {
              "name1": {
                "query": "foo bar"
              }
            }
          }, {
            "match": {
              "name2": {
                "query": "foo bar"
              }
            }
          }, {
            "match": {
              "name3": {
                "query": "foo bar"
              }
            }
          }]
        }
      }
    }
  }
}

使用Elasticsearch 2.4

1 个答案:

答案 0 :(得分:1)

boolean query结合了所有子查询的分数。来自docs:

  

bool查询采用更多匹配更好的方法,因此得分   从每个匹配的must或should子句将被加在一起   为每个文档提供最终的_score。

对于您的情况,您希望使用其他加入查询:The dis_max query

  

生成由其生成的文档的并集的查询   子查询,并为每个文档评分最高分数   该文档由任何子查询生成,加上打破平局   任何其他匹配子查询的增量。

示例:

{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "name1": {
              "query": "foo bar"
            }
          }
        },
        {
          "match": {
            "name2": {
              "query": "foo bar"
            }
          }
        },
        {
          "match": {
            "name3": {
              "query": "foo bar"
            }
          }
        }
      ]
    }
  }
}

*请注意,我在ES6上写了这个,它不再有filtered查询,但我希望你能得到主旨:)

希望这有帮助!