【问题标题】:Elasticsearch match against filter onlyElasticsearch 仅与过滤器匹配
【发布时间】:2019-01-04 01:19:18
【问题描述】:

我们有一个多租户索引,并且只需要针对单个租户的索引执行查询。基本上,对于所有匹配过滤器的文档,返回任何匹配以下查询的文档,但不包括只匹配过滤器的文档。

例如,假设我们有一个文档列表,如下所示:

{ _id: 1, account_id: 1, name: "Foo" }
{ _id: 2, account_id: 2, name: "Bar" }
{ _id: 3, account_id: 2, name: "Foo" }

我认为这个查询会起作用,但它不起作用:

{
  "bool": {
    "filter": { "term": { "account_id": 2 } },
    "should": [
      { "match": { "name": "Foo" }
    ]
  }
}

它返回匹配account_id: 2的两个文档:

{ _id: 3, account_id: 2, name: "Foo", score: 1.111 }
{ _id: 2, account_id: 2, name: "Bar", score: 0.0 }

我真正想要的只是返回文档_id: 3,它基本上是“在所有 account_id 等于 2 的文档中,只返回名称与 Foo 匹配的文档”。

如何使用 ES 6.2 完成此任务?需要注意的是shouldmust 匹配条件的数量并不总是已知的,我真的想避免使用minimum_should_match

【问题讨论】:

    标签: elasticsearch elasticsearch-6


    【解决方案1】:

    试试这个:只需将 should 替换为 must

    {
      "bool": {
        "filter": { "term": { "account_id": 2 } },
        "must": [
          { "match": { "name": "Foo" }
        ]
      }
    }
    

    【讨论】:

    • 谢谢!我们有多个可以匹配的字段,对于这个特定的搜索,我刚刚找到了multi_match,所以我认为我们将使用must: { multi_match: {} }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多