Elasti c запрос bool должен соответствовать проблеме - PullRequest
3 голосов
/ 16 января 2020

Ниже приведена часть запроса в Elastic GET API через командную строку внутри openshift pod, я получаю весь запрос на совпадение, а также элемент несоответствия в выборке из 2000 документов. Как я могу ограничить только элемент соответствия. Я хочу специально получить {\"kubernetes.container_name\":\"xyz\"}} только.

любые предложения будут оценены

-d ' {\"query\": { \"bool\" :{\"must\" :{\"match\" :{\"kubernetes.container_name\":\"xyz\"}},\"filter\" : {\"range\": {\"@timestamp\": {\"gte\": \"now-2m\",\"lt\": \"now-1m\"}}}}},\"_source\":[\"@timestamp\",\"message\",\"kubernetes.container_name\"],\"size\":2000}'"

1 Ответ

1 голос
/ 16 января 2020

Для точных совпадений вам нужно сделать две вещи:

Текст Тип данных проходит через Анализ фаза.

Например, если ваши данные This is a beautiful day, во время приема, тип данных text будет разбивать слова на токены, вставлять их в нижний регистр [this, is, a, beautiful, day] и затем добавлять их в инвертированный индекс. Этот процесс происходит с помощью Standard Analyzer , который является анализатором по умолчанию, применяемым к текстовому полю.

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

Чтобы выполнить точное совпадение, вам необходимо использовать поля keyword, так как не проходит фазу анализа.

Я бы предложил создать одноуровневое поле для ключевого слова для текстового поля, которое у вас есть ниже, и затем повторно ввести все данные:

Отображение:

PUT my_sample_index
{
  "mappings": {
    "properties": {
      "kubernetes":{
        "type": "object",
        "properties": {
          "container_name": {
            "type": "text",
            "fields":{               <--- Note this
              "keyword":{            <--- This is container_name.keyword field
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}

Обратите внимание, что я предполагаю, что вы используете тип object.

Запрос запроса:

POST my_sample_index
{
  "query":{
    "bool": {
      "must": [
        {
          "term": {
            "kubernetes.container_name.keyword": {
              "value": "xyz"
            }
          }
        }
      ]
    }
  }
}

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

...