不仅获取elasticsearch中指定的元素

问题描述 投票:0回答:1

我有以下文件:

POST colours/_doc/1
{
  "colour": ["green", "red", "blue", "yellow", "pink", "orange", "dark", "bright", "lilac", "turquoise", "gold", "silver"]
}

POST colours/_doc/2
{
  "colour": ["blue", "yellow"]
}

POST colours/_doc/3
{
  "colour": ["green"]
}

我只想获取 ID 为 1 和 2 的那些,因为我不想只获取绿色的。我还想计算这种情况下出现的次数,所以它会返回 2。我用这个查询进行了管理:

GET colours/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "colour": ["red",
              "blue",
              "yellow",
              "pink",
              "orange",
              "dark",
              "bright",
              "lilac",
              "turquoise",
              "gold",
              "silver"]
          }
        }
      ]
    }
  }
}

但是,我不想在

terms
查询中指定所有颜色,因为在我的用例中,数组可以包含数百个值。理想情况下会是这样的:

GET colours/_search
{
  "query": {
    "bool": {
      "not_only": [
        {
          "terms": {
            "colour": ["green"]
          }
        }
      ]
    }
  }
}

有什么想法吗?

elasticsearch kibana
1个回答
0
投票

我们可以做以下事情:

  • 查找条件:查找
    colour
    数组中包含一个精确项
    green
  • 否定上述条件即可得到其他条件

第一个条件是这样的:

"bool": {
    "must": [
        {
            "match": {
                "colour": "green"
            }
        }
    ],
    "filter": {
        "script": {
            "script": "doc['colour.keyword'].length == 1"
        }
    }
}

要否定上述条件,只需将其放入另一个

bool
中,如下所示:

{
    "query": {
        "bool": {
            "must_not": [
                {
                    "bool": {
                        "must": [
                            {
                                "match": {
                                    "colour": "green"
                                }
                            }
                        ],
                        "filter": {
                            "script": {
                                "script": "doc['colour.keyword'].length == 1"
                            }
                        }
                    }
                }
            ]
        }
    }
}

这取决于您对

colour
的映射,我使用
colour.keyword
是因为我的颜色映射是文本,关键字必须用于脚本。

"properties": {
    "colour": {
        "type": "text",
        "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
    }
}

结果就是一切,除了

["green"]

{
    "took": 10,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 0.0,
        "hits": [
            {
                "_index": "color",
                "_id": "1",
                "_score": 0.0,
                "_source": {
                    "colour": [
                        "green",
                        "red",
                        "blue",
                        "yellow",
                        "pink",
                        "orange",
                        "dark",
                        "bright",
                        "lilac",
                        "turquoise",
                        "gold",
                        "silver"
                    ]
                }
            },
            {
                "_index": "color",
                "_id": "2",
                "_score": 0.0,
                "_source": {
                    "colour": [
                        "blue",
                        "yellow"
                    ]
                }
            }
        ]
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.