Вложенный запрос Elasticsearch с обязательными и недопустимыми полями - PullRequest
1 голос
/ 10 июля 2020

Пример данных

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, но соответствует не соответствует ни одному другому рангу.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Измените свой запрос, как показано ниже:

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_not во внешнее предложение must.

Таким образом поможет вам найти необходимое решение.

Надеюсь, это поможет!

0 голосов
/ 11 июля 2020

Я закончил выяснять правильный синтаксис, чтобы получить то, что мне нужно. Вот что сработало для меня, если это поможет кому-то еще:

{
  "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
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
...