#elasticsearch
#elasticsearch
Вопрос:
В настоящее время у меня есть массив объектов, который включает:
{
"key": "party",
"str_val": "THE TWITTER INC"
}
и
{
"key": "party",
"str_val": "twitter inc"
}
Соответствующая часть моего сопоставления:
"key": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"str_val": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
Когда я пытаюсь выполнить сопоставление по шаблону следующим образом:
"wildcard": {
"metadata.str_val": "*twitter*"
}
возвращаются оба документа. Но если я изменю свой запрос, чтобы включить пробел:
"wildcard": {
"metadata.str_val": "*twitter inc*"
}
документы не возвращаются. Как мне выполнить поиск по шаблону с пробелами?
Ответ №1:
Вариант 1:
С вашим текущим отображением, т. е. без использования анализатора, query_string должен работать для вас.
PUT my_index2/doc/1
{
"key": "party",
"str_val": "THE TWITTER INC"
}
PUT my_index2/doc/2
{
"key": "party",
"str_val": "twitter inc"
}
POST my_index2/_search
{
"query": {
"query_string": {
"default_field": "str_val",
"query": "*twitter inc*"
}
}
}
Вариант 2:
Однако, если вы хотите использовать подстановочный знак, вам необходимо добавить пользовательский анализатор, как показано ниже:
PUT my_index/
{
"settings": {
"analysis": {
"analyzer": {
"k_lowercase": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"key": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"str_val": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"analyzer":"k_lowercase"
}
}
}
}
}
Теперь добавьте записи после установки анализатора :
PUT my_index/doc/1
{
"key": "party",
"str_val": "THE TWITTER INC"
}
PUT my_index/doc/2
{
"key": "party",
"str_val": "twitter inc"
}
POST my_index/_search
{
"query": {
"wildcard": {
"str_val": {
"value": "*twitter inc*"
}
}
}
}