Использование JSON в Kibana поиске

Kate

Administrator
Команда форума
При поиске из Kibana вы обычно вводите фактическую строку запроса в верхнюю панель, как мы видели это в уроке. Если строки запроса недостаточно для того, что вам нужно, у вас также есть возможность написать JSON в этой строке.

Вы можете записать JSON-объект, который вы бы прикрепили к ключу "query (запрос)" при взаимодействии с Elasticsearch в этом поле, например:

{ "range": { "numeric": { "gte": 10 } } }
Это было бы эквивалентно записи numeric:>=10 в это поле. Чаще всего это имеет смысл только в том случае, если вам нужен доступ к опциям, которые доступны только в JSON-запросе, но не в строке запроса.

Предупреждение: если вы впишете JSON query_string в это поле (например, потому что хотите иметь доступ к lowercase_expanded_terms), Kibana сохранит правильный JSON для запроса, но снова покажет вам (после нажатия клавиши enter) только часть “запроса” вашего JSON. Это может быть очень запутанным и, конечно, если Вы сейчас введете текст и нажмете enter еще раз, он также потеряет параметры, которые Вы установили через JSON, так что это действительно должно быть использовано с осторожностью.

Особые случаи​

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

Elasticseach не находит термины в длинных полях.

Это, по моему опыту, довольно распространенная проблема, и ее непросто решить, если вы не знаете, что ищете.

Elasticsearch имеет параметр ignore_above, который вы можете установить в отображении для каждого поля. Это числовое значение, которое приведет к тому, что Elasticsearch НЕ будет индексировать значения дольше, чем задано значением ignore_above, когда будет вставлен документ. Значение все равно будет сохранено, поэтому при просмотре документа вы его увидите, но не сможете найти.

Как проверить, установлено ли это значение в поле? Вам нужно получить отображение из Elasticsearch, вызвав <your-elasticsearch-domain>/<your-index-name>/_mapping. В возвращаемом JSON где-то будет отображение для искомого поля, которое может выглядеть следующим образом:

"fieldName": {
"type": "string",
"ignore_above": 15
}
В этом случае значения выше 15 символов не индексируются, и их поиск невозможен.

Пример: Используя вышеприведенное отображение, давайте вставим два документа в этот Elasticsearch:

{ "fieldName": "short string" }
{ "fieldName": "a string longer as ignore_above" }
Если вы теперь перечислите все документы (в Kibana или Elasticsearch), то увидите, что оба документа находятся там и значение обоих полей - это то, что вы вставили в строку. Но если вы теперь будете искать fieldName:longer, вы не получите никаких результатов (в то время как fieldName:short вернет первый документ). Elasticsearch обнаружил, что значение "строка длиннее чем ignore_above" длиннее 15 символов, и поэтому оно сохраняет его только в документе, но не индексирует его, поэтому вы не сможете искать в нем ничего, так как в инвертированном индексе для этого поля не будет содержимого этого значения.

Поиск требует определенного поля, без которого он не работает.​

Если вы можете выполнить поиск, например, для author:foo, но не для foo, то, скорее всего, это "проблема" с вашим default_field. Elasticsearch предваряет поле по умолчанию перед foo. Это поле можно настроить так, чтобы оно отличалось от _all.

Возможно, настройка поля index.query.default_field была установлена на что-то другое, и Elasticsearch не использует поле _all, что может привести к проблеме.

Также возможно, что поле_all ведет себя не так, как вы ожидали, потому что оно было настроено каким-то другим образом. Вы можете исключить конкретные поля из поля _all (например, в приведенном выше примере fieldName могло быть исключено из индексации в поле _all) или были изменены опции анализа/индексации в отображении поля_all.


Источник статьи: https://habr.com/ru/company/otus/blog/554078/
 
Сверху