Эластичный поисковый запрос с использованием списка Python

Как передать список в качестве строки запроса для запроса match_phrase?

Это работает:

{match_phrase: {requestParameters.bucketName: {запрос: xxx}}},

Это не:

        {
            "match_phrase": {
                "requestParameters.bucketName": {
                    "query": [
                        "auditloggingnew2232",
                        "config-bucket-123",
                        "web-servers",
                        "esbck-essnap-1djjegwy9fvyl",
                        "tempexpo",
                    ]
                }
            }
        }

person shantanuo    schedule 25.07.2020    source источник
comment
Приходилось ли пытаться использовать bool запрос? Ссылка: stackoverflow.com/a/30020384/11774805   -  person Kashyap KN    schedule 25.07.2020
comment
Мой вопрос: поддерживает ли match_phrase список, подобный этому: {match_phrase: {text: [St Peter Fm, Cape Basin]}}? Что-то вроде multi_match, но для условия поиска вместо полей.   -  person shantanuo    schedule 25.07.2020
comment
Использование query_string — хороший обходной путь. Мой вопрос: почему match_phrase не поддерживает список?   -  person shantanuo    schedule 28.07.2020
comment
Зачем вам match_phrase, если вы ищете только один токен?   -  person Val    schedule 28.07.2020
comment
Я пытаюсь найти 5 имен ведер, используя параметр ИЛИ. Вопрос в том, как сделать запрос максимально кратким. Будет очень полезно, если эластичный поддерживает синтаксис, показанный в вопросе.   -  person shantanuo    schedule 31.07.2020
comment
Я понял, но match_phrase предназначен для сопоставления токенов, следующих друг за другом. Вы запрашиваете отдельные токены, поэтому запрос terms, вероятно, подойдет вам.   -  person Val    schedule 05.01.2021


Ответы (1)


match_phrase просто не поддерживает несколько значений.

Вы можете использовать запрос should:

GET _search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "requestParameters.bucketName": {
              "value": "auditloggingnew2232"
            }
          }
        },
        {
          "match_phrase": {
            "requestParameters.bucketName": {
              "value": "config-bucket-123"
            }
          }
        }
      ]
    },
    ...
  }
}

или, как указал @Val, запрос terms:

{
  "query": {
    "terms": {
      "requestParameters.bucketName": [
        "auditloggingnew2232",
        "config-bucket-123",
        "web-servers",
        "esbck-essnap-1djjegwy9fvyl",
        "tempexpo"
      ]
    }
  }
}

это работает как OR на точных условиях.

Я предполагаю, что 1) рассматриваемые имена корзин уникальны и 2) что вы не ищете частичные совпадения. Если это так, плюс если на поле bucketName почти не установлены анализаторы, то match_phrase может и не понадобиться! terms подойдет. Разница между запросами term и match_phrase прекрасно объясняется здесь.

person Joe Sorocin    schedule 06.01.2021
comment
удачи с этим @shantanuo? - person Joe Sorocin; 08.01.2021