Я определенно думаю, что ваш анализатор, вероятно, подходит для вашего случая использования. Я подозреваю, что вам нужна помощь во время запроса.
Я настроил свой индекс, используя ваши анализаторы, и создал поле, используя его:
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"keyword_analyzer": {
"char_filter\"": [],
"filter": [
"lowercase",
"asciifolding",
"trim"
],
"type": "custom",
"tokenizer": "keyword"
},
"edge_ngram_analyzer": {
"filter": [
"lowercase"
],
"tokenizer": "edge_ngram_tokenizer"
},
"edge_ngram_search_analyzer": {
"tokenizer": "lowercase"
}
},
"tokenizer": {
"edge_ngram_tokenizer": {
"token_chars": [
"letter"
],
"min_gram": "2",
"type": "edge_ngram",
"max_gram": "5"
}
}
}
},
"mappings": {
"test_doc": {
"properties": {
"full_name": {
"type": "text",
"analyzer": "edge_ngram_analyzer"
}
}
}
}
}
Затем я индексирую несколько документов:
PUT test/test_doc/1
{
"full_name": "John Doe"
}
PUT test/test_doc/2
{
"full_name": "Jane Doe"
}
PUT test/test_doc/3
{
"full_name": "Johnatan Lebus"
}
И затем я использую следующий запрос для вашего последнего случая, в качестве примера.
GET test/_search
{
"query": {
"match": {
"full_name": {
"operator": "and",
"query": "doe john"
}
}
}
}
Заменаполе «запрос» с любым вашим текстом выше дает нам результаты, которые мы хотим.Настоящее «решение» вашей проблемы здесь - это быть немного более креативным во время запроса, хотя это и не представляется возможным с точки зрения токена.
Надеюсь, это поможет!