ElasticSearch точное совпадение текста во вложенном поле — Java

#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");