【问题标题】:Search according to the best field match in Elasticsearch根据 Elasticsearch 中的最佳字段匹配进行搜索
【发布时间】:2018-05-02 15:25:35
【问题描述】:

在下面的文档中搜索“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

【问题讨论】:

  • 也许想分享您的查询? :)
  • @ByronVoorbach 编辑了帖子

标签: elasticsearch search full-text-search


【解决方案1】:

boolean query 结合了所有子查询的得分。来自文档:

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 查询了,但我希望你能明白要点:)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多