Индексные поля с дефисами в Elasticsearch
Я пытаюсь понять, как настроить elasticsearch, чтобы я мог выполнять поиск строк запроса с подстановочными знаками в полях, которые включают дефисы.
у меня есть документы, которые выглядят так:
{
"tags":[
"deck-clothing-blue",
"crew-clothing",
"medium"
],
"name":"Crew t-shirt navy large",
"description":"This is a t-shirt",
"images":[
{
"id":"ba4a024c96aa6846f289486dfd0223b1",
"type":"Image"
},
{
"id":"ba4a024c96aa6846f289486dfd022503",
"type":"Image"
}
],
"type":"InventoryType",
"header":{
}
}
Я попытался использовать фильтр word_delimiter и токенизатор пробелов:
{
"settings" : {
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 1
},
"analysis" : {
"filter" : {
"tags_filter" : {
"type" : "word_delimiter",
"type_table": ["- => ALPHA"]
}
},
"analyzer" : {
"tags_analyzer" : {
"type" : "custom",
"tokenizer" : "whitespace",
"filter" : ["tags_filter"]
}
}
}
},
"mappings" : {
"yacht1" : {
"properties" : {
"tags" : {
"type" : "string",
"analyzer" : "tags_analyzer"
}
}
}
}
}
но эти поиски (для тегов) и их результаты:
deck* -> match
deck-* -> no match
deck-clo* -> no match
кто-нибудь видит, где я ошибаюсь?
спасибо :)
1 ответов
анализатор в порядке (хотя я бы потерял фильтр), но ваш анализатор поиска не указан, поэтому он использует стандартный анализатор для поиска поля тегов, которое удаляет дефис, а затем пытается запросить его (run curl "localhost:9200/_analyze?analyzer=standard" -d "deck-*"
чтобы увидеть, что я имею в виду)
в основном, "палуба - *" ищется как " палуба * "нет слова, которое имеет только" палуба " в нем, поэтому он терпит неудачу.
"deck-clo*" ищется как " deck clo*", опять же нет слова, которое просто "палуба" или начинается с "clo", поэтому запрос не выполняется.
Я бы сделал следующие модификации
"analysis" : {
"analyzer" : {
"default" : {
"tokenizer" : "whitespace",
"filter" : ["lowercase"] <--- you don't need this, just thought it was a nice touch
}
}
}
тогда избавьтесь от специального анализатора на тегах
"mappings" : {
"yacht1" : {
"properties" : {
"tags" : {
"type" : "string"
}
}
}
}
дайте мне знать, как это происходит.