Запрос ElasticSearch из списка содержит X и содержит что-то отличное от X - PullRequest
0 голосов
/ 31 января 2019

Предположим, что в моем Elasticsearch у меня есть поле 'ListNames', которое предоставляет список словарей.Один из ключей в каждом словаре - «Люди».Моя цель состоит в том, чтобы запрашивать / фильтровать из ES все соответствующие профили, где «ListNames.People» содержит «Адам» и содержит имя, которое НЕ «Адам».Без подробного списка всех возможных Имен (поскольку их много), как я мог бы достичь этого?Спасибо за любую помощь заранее.

В приведенном ниже коде показаны примеры постов, которые я пробовал

#Note: this returns profiles with ONLY Adam contained in the ListNames.
post_data = {
    "size": 30,
    "query": {
        'match':{
            'ListNames.People':'Adam'
        }
    }
}



#################
post_data = {
    "size": 30,
    "query": {
        'bool': {
            'should': [{
                'match': {
                    'ListNames.People': 'Adam'
                }
            }],
            'must_not':[
                {'match':{'ListNames.People':'Adam'}}
            ]
        }
    }
}
###################
post_data = {
    "size": 30,
    "query": {
        'bool': {
            'must': [{
                'match': {
                    'ListNames.People': 'Adam'
                }
            }],
            'must_not':[
                {'match':{'ListNames.People':'Adam'}}
            ]
        }
    }
}

В первом посте возвращаются результаты, содержащие только Адама, что нежелательно, а остальныедва возвращаются пустыми.

1 Ответ

0 голосов
/ 31 января 2019

Обновление после обсуждения в комментариях

Вы должны использовать безболезненно, чтобы проверить такое состояние.Обратите внимание, что использование скрипта может привести к снижению производительности.

Запрос будет:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "ListNames.People": "Adam"
          }
        },
        {
          "script": {
            "script": {
              "source": "for(int i = 0; i < doc['ListNames.People'].length; i++) { if(doc['ListNames.People'][i] != params.person) { return true; }} return false;",
              "lang": "painless",
              "params": {
                "person": "Adam"
              }
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...