Для частичного совпадения тип данных свойства должен быть text
, а для точного - keyword
.Для обеспечения возможности частичного и точного поиска без индексации данных для различных свойств вы можете использовать fields
.Что он делает, так это то, что он помогает индексировать одни и те же данные разными способами.
Итак, допустим, вы хотите проиндексировать имена людей и иметь возможность частичного и точного поиска.В таком случае отображение будет:
PUT test
{
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
Позволяет индексировать несколько документов:
PUT test/_doc/1
{
"name": "Nishant Saini"
}
PUT test/_doc/2
{
"name": "Nishant Kumar"
}
Для частичного поиска нам нужно запросить поле name
, и оно имеет тип text
.
GET test/_doc/_search
{
"query": {
"query_string": {
"query": "Nishant Saini",
"field": [
"name"
]
}
}
}
Приведенный выше запрос вернет оба документа (1 и 2), поскольку в обоих документах для одного поля появляется Nishant
для поля name
.
Для точного поисканам нужно запросить name.keyword
.Для точного соответствия мы можем использовать термин запроса, как показано ниже:
{
"query": {
"term": {
"name.keyword": "Nishant Saini"
}
}
}
Это будет соответствовать только документу 1.