#java #elasticsearch
#java #elasticsearch
Вопрос:
Сопоставление содержит вложенное поле.
Мне интересно, возможно ли точное совпадение по «значению» без изменения его типа на «ключевое слово».
"mappings": {
"properties": {
"tag": {
"type": "nested",
"properties": {
"value": {
"type": "text"
},
"key": {
"type": "keyword"
}
}
}
}
}
Ниже приведен код, который я пытался выполнить точное совпадение в поле «значение».
BoolQueryBuilder boolQ = boolQuery();
boolQ.must(matchQuery("tag.key", "key"));
boolQ.must(matchQuery("tag.value", "value").fuzziness(Fuzziness.ZERO));
entireQuery.must(nestedQuery("tag", boolQ, ScoreMode.None));
Приведенный выше результат также соответствовал обозначенным словам «value».
Я был бы очень признателен, если бы присутствовали какие-либо ссылки, связанные с вопросом.
Ответ №1:
Поскольку tag.value
имеет тип text
, его содержимое было проанализировано, и результирующие токены (т.Е. Не Точное значение) Были проиндексированы в Elasticsearch.
Несмотря term
на то, что запрос не анализирует токен поиска, здесь это не помогает, потому что индексированные токены уже проанализированы.
Теперь есть два варианта:
A. Если tag.value
содержит только один токен (например "Dog"
), вы все равно можете точно сопоставить их, используя либо term
или match
, но в нижнем регистре, как в:
{
"nested": {
"path": "tag",
"query":{
"term":{
"tag.value":"dog"
}
}
}
}
B. Если tag.value
содержит несколько токенов (например "the big dog"
), поэтому поиск их точного значения больше невозможен.
Ответ №2:
Вы можете использовать Term query
, который возвращает документы, содержащие точный термин в предоставленном поле.
Для получения дополнительной информации посетите страницу ниже, https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
Комментарии:
1. В документации указано
avoid using the term query for text fields
, что имеет смысл, поскольку значение текстового поля было проанализировано во время индексации.term
Запрос просто не будет анализировать термин, указанный в качестве входных данных для поиска, но не может изменить способ, которым значение поля было проанализировано и проиндексировано в Elasticsearch.
Ответ №3:
По сути, вы ищете «запрос термина», который возвращает «документы, содержащие точный термин в предоставленном поле».
{
"query":{
"term":{
"value":"your input"
}
}
}
Вот ссылка на то же самое:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
Комментарии:
1. В документации указано
avoid using the term query for text fields
, что имеет смысл, поскольку значение текстового поля было проанализировано во время индексации.term
Запрос просто не будет анализировать термин, указанный в качестве входных данных для поиска, но не может изменить способ, которым значение поля было проанализировано и проиндексировано в Elasticsearch.
Ответ №4:
Используйте фразу соответствия
GET /_search
{
"query": {
"match_phrase": {
"message": "7000-8900"
}
}
}
В Java используйте matchPhraseQuery из QueryBuilder
QueryBuilders.matchPhraseQuery("message", "7000-8900");