Поисковый запрос Elastics, чтобы отфильтровать результат, имеющий значение A в списке, но не B - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь сформировать запрос, в котором требуется отфильтровать только те данные, для которых страна является Индией, но не США.

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

{
  "data": {
    "attributes": {
      "name": "test",
       "country": ["india","usa","japan"]
    }
  }
}

Как и в приведенном вышеНапример, у нас есть Индия и США, он не должен фильтровать результат.

, тогда как он должен фильтровать, если данные имеют формат, указанный ниже.

ex1:

{
  "data": {
    "attributes": {
      "name": "test",
       "country": ["india","japan"]
    }
  }
}

ex2:

{
  "data": {
    "attributes": {
      "name": "test",
       "country": ["india"]
    }
  }
}

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Запрос выглядит так:

GET countries/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "data.attributes.country.keyword":{
              "value": "india"
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "data.attributes.country":{
              "value": "usa"
            }
          }
        }
      ]
    }
  }
}

Ответ:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.16786805,
    "hits" : [
      {
        "_index" : "countries",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.16786805,
        "_source" : {
          "data" : {
            "attributes" : {
              "name" : "test",
              "country" : [
                "india"
              ]
            }
          }
        }
      },
      {
        "_index" : "countries",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.13353139,
        "_source" : {
          "data" : {
            "attributes" : {
              "name" : "test",
              "country" : [
                "india",
                "japan"
              ]
            }
          }
        }
      }
    ]
  }
}

Шаги для воспроизведения:

PUT countries  

PUT countries/_doc/1
{
  "data": {
    "attributes": {
      "name": "test",
      "country": [
        "india",
        "usa",
        "japan"
      ]
    }
  }
}

PUT countries/_doc/2
{
  "data": {
    "attributes": {
      "name": "test",
      "country": [
        "india",
        "japan"
      ]
    }
  }
}

PUT countries/_doc/3
{
  "data": {
    "attributes": {
      "name": "test",
      "country": [
        "india"
      ]
    }
  }
}
0 голосов
/ 18 октября 2019

Вы можете использовать предложения filter (или must) и must_not в запросе boolean. Если я правильно понял ваше требование, вы можете использовать следующее:

{
  "query": {
    "bool" : {
      "filter": {
        "term" : { "data.attributes.country" : "india" }
      },
      "must_not" : {
        "term" : { "data.attributes.country" : "usa" }

      }
    }
  }
}

Документация для boolean и term довольно обширна исодержат много примеров.

0 голосов
/ 18 октября 2019

Вопрос выглядел немного запутанным. Я полагаю, вы не хотите, чтобы Индия и США объединились. Исходя из вышеизложенного предположения, следующий запрос является общим.

"query": {
        "bool": {
            "must": [{
                    "term": {
                        "tags": {
                            "value": "india"
                        }
                    }
                }
            ],
            "must_not": [{
                    "term": {
                        "tags": {
                            "value": "usa"
                        }
                    }
                }
            ]
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...