[英]Elasticsearch Nested Query with Must and Must Not with same fields
樣本數據
poll_A:
{
popular: [
{ domains: [ "google.com", "etsy.com", "amazon.com" ], rank: 1 },
{ domains: [ "google.com", "amazon.com" ], rank: 2 },
]
}
poll_B:
{
popular: [
{ domains: [ "google.com", "etsy.com", "amazon.com" ], rank: 1 },
{ domains: [ "google.com", "etsy.com", "amazon.com" ], rank: 2 },
]
}
我正在嘗試創建一個查詢,該查詢將檢查域是否僅存在於排名 1。以下查詢是我開始的,因為它看起來是正確的。 但是,無論我要檢查哪個等級,匹配查詢似乎都會檢查嵌套字段的每個實例。
{
"query": {
"nested": {
"path": "popular",
"query": {
"bool": {
"must": [
{
"match": {
"popular.domains": "etsy.com"
}
},
{
"match": {
"popular.rank": 1
}
}
],
"must_not": [
{
"match": {
"popular.domains": "etsy.com"
}
},
{
"range": {
"popular.rank": {
"gte": 2
}
}
}
]
}
}
}
}
}
本質上,我想檢查該域是否與排名 1 匹配,但與任何其他排名不匹配。
我最終找出了正確的語法來獲得我需要的東西。 如果它可以幫助其他人,這對我有用:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "popular",
"query": {
"bool": {
"must": [
{
"match": {
"popular.Domains": "etsy.com"
}
},
{
"match": {
"popular.Rank": 1
}
}
]
}
}
}
}
],
"must_not": [
{
"nested": {
"path": "popular",
"query": {
"bool": {
"must": [
{
"match": {
"popular.Domains": "etsy.com"
}
},
{
"range": {
"popular.Rank": {
"gte": 2
}
}
}
]
}
}
}
}
]
}
}
}
修改您的查詢如下:
POST <your_index_name>/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "popular",
"query": {
"bool": {
"must": [
{
"match": {
"popular.domains": "etsy.com"
}
},
{
"match": {
"popular.rank": 1
}
}
]
}
}
}
}
],
"must_not": [
{
"nested": {
"path": "popular",
"query": {
"bool": {
"must": [
{
"match": {
"popular.domains": "etsy.com"
}
},
{
"range": {
"popular.rank" :{
"gte": 2
}
}
}
]
}
}
}
}
]
}
}
}
請注意結構,我如何在外部must
子句中推送must_not
的代碼。
這樣,它將幫助您獲得所需的解決方案。
希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.