Индексные поля с дефисами в 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"
            }
        }
    }
}

дайте мне знать, как это происходит.