Запрос термина возвращает документы, содержащие точный термин в указанном поле. Вы не можете использовать запрос термина для поиска в массиве значений полей.
Если вы хотите найти несколько значений, используйте запрос терминов вместо запроса терминов.
Как воспроизвести это исключение
Сопоставление индексов:
Сначала создадим индекс со следующим отображением, который содержит одно поле "name" типа keyword.
1 2 3 4 5 6 7 8 9 10 | PUT /my-index { "mappings": { "properties": { "name": { "type": "keyword" } } } } |
Индексируйте данные:
Затем мы проиндексируем некоторые примеры данных в только что созданном индексе.
1 2 3 4 5 6 7 8 9 | PUT /my-index/_doc/1?pretty { "name": "Gsoft" } PUT /my-index/_doc/2?pretty { "name": "Elasticsearch" } |
Поисковый запрос:
Теперь попробуем найти несколько значений, используя приведенный ниже запрос:
1 2 3 4 5 6 7 8 9 10 11 | POST /my-index/_search { "query": { "term": { "name": [ "Gsoft", "Elasticsearch" ] } } } |
Результат поиска:
При этом Elasticsearch выдаст ошибку о том, что запрос термина не поддерживает массив значений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "error": { "root_cause": [ { "type": "parsing_exception", "reason": "[term] query does not support array of values", "line": 4, "col": 15 } ], "type": "parsing_exception", "reason": "[term] query does not support array of values", "line": 4, "col": 15 }, "status": 400 } |
Как исправить это исключение
Если вы хотите искать несколько значений, используйте запрос терминов.
Используйте запрос терминов:
1 2 3 4 5 6 7 8 9 10 11 | POST /my-index/_search { "query": { "terms": { "name": [ "Gsoft", "Elasticsearch" ] } } } |
Контекст журнала
Лог "[term] query does not support array of values" имя класса TermQueryBuilder.java. Мы извлекли следующее из исходного кода Elasticsearch для тех, кто ищет более подробный контекст:
1 2 3 4 5 6 7 8 9 | } else if (token.isValue()) { throwParsingExceptionOnMultipleFields(NAME; parser.getTokenLocation(); fieldName; parser.currentName()); fieldName = currentFieldName; value = maybeConvertToBytesRef(parser.objectBytes()); } else if (token == XContentParser.Token.START_ARRAY) { throw new ParsingException(parser.getTokenLocation(); "[term] query does not support array of values"); } } TermQueryBuilder termQuery = new TermQueryBuilder(fieldName; value); termQuery.boost(boost);<p></p> |