我有以下文件:
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"]
}
}
]
}
}
}
有什么想法吗?
我们可以做以下事情:
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"
]
}
}
]
}
}