Во-первых, давайте посмотрим анализатор синонимов и как вы включаете файл. Отсюда https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html вы можете увидеть, как это можно настроить. Вы упоминаете два файла. Вам лучше определить один файл, который включает или ваши синонимы.
{
"settings": {
"index": {
"number_of_shards": "128",
"number_of_replicas": "0",
"analysis": {
"filter": {
"dbl_metaphone": {
"type": "phonetic",
"encoder": "double_metaphone",
"max_code_len": 5
},
"given_synonyms": {
"type": "synonym",
"synonyms_path": "analysis/given_synonyms.txt"
},
"surname_synonyms": {
"type": "synonym",
"synonyms_path": "analysis/surname_synonyms.txt"
}
},
"analyzer": {
"dbl_metaphone": {
"tokenizer": "standard",
"filter": "dbl_metaphone"
},
"given_synonyms": {
"tokenizer": "whitespace",
"filter": "given_synonyms"
},
"surname_synonyms": {
"tokenizer": "whitespace",
"filter": "surname_synonyms"
}
}
}
}
}
}
Имейте в виду, что при использовании файла (или нескольких файлов) для синонимов необходимо убедиться, что каждый узелasticsearch имеет доступ к этому файлу. Другой способ сделать это - указать свои синонимы в разделе настроек. Это может быть лучше, если число синонимов не очень велико или есть проблемы с тем, чтобы сделать файлы доступными для узлов эластичного поиска. Вы можете проверить другие способы определения синонимов в документации
{
"settings": {
"index": {
"number_of_shards": "128",
"number_of_replicas": "0",
"analysis": {
"filter": {
"dbl_metaphone": {
"type": "phonetic",
"encoder": "double_metaphone",
"max_code_len": 5
},
"given_synonyms": {
"type": "synonym",
"synonyms": [ ... YOUR SYNONYMS HERE ...]
},
"surname_synonyms": {
"type": "synonym",
"synonyms": [ ... YOUR SYNONYMS HERE ...]
}
},
"analyzer": {
"dbl_metaphone": {
"tokenizer": "standard",
"filter": "dbl_metaphone"
},
"given_synonyms": {
"tokenizer": "standard",
"filter": "given_synonyms"
},
"surname_synonyms": {
"tokenizer": "standard",
"filter": "surname_synonyms"
}
}
}
}
}
}
. Для достижения окончательного решения вы можете иметь что-то вроде этого
{
"settings": {
"index": {
"number_of_shards": "128",
"number_of_replicas": "0",
"analysis": {
"filter": {
"dbl_metaphone": {
"type": "phonetic",
"encoder": "double_metaphone",
"max_code_len": 5
},
"given_synonyms": {
"type": "synonym",
"synonyms_path": "analysis/given_synonyms.txt"
},
"surname_synonyms": {
"type": "synonym",
"synonyms_path": "analysis/surname_synonyms.txt"
}
},
"analyzer": {
"dbl_metaphone": {
"tokenizer": "standard",
"filter": "dbl_metaphone"
},
"dbl_metaphone_given_synonym": {
"tokenizer": "standard",
"filter": [
"given_synonyms",
"dbl_metaphone"
]
},
"dbl_metaphone_surname_synonym": {
"tokenizer": "standard",
"filter": [
"surname_synonyms",
"dbl_metaphone"
]
}
}
}
}
}
}
В этом у вас есть три анализатора в целом. Два из них объединяют два фильтра (выход первого является входом второго, поэтому порядок имеет значение). Вasticsearch вы можете указать, что поле будет анализироваться одним анализатором в течение индексного времени, а при поиске по какому-либо входу этот вход будет анализироваться другим анализатором. Таким образом, вы можете получить что-то вроде этого (отсюда https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html)
{
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
Таким образом, ваши настройки / сопоставления станут такими
{
"settings": {
"index": {
"number_of_shards": "128",
"number_of_replicas": "0",
"analysis": {
"filter": {
"dbl_metaphone": {
"type": "phonetic",
"encoder": "double_metaphone",
"max_code_len": 5
},
"given_synonyms": {
"type": "synonym",
"synonyms_path": "analysis/given_synonyms.txt"
},
"surname_synonyms": {
"type": "synonym",
"synonyms_path": "analysis/surname_synonyms.txt"
}
},
"analyzer": {
"dbl_metaphone": {
"tokenizer": "standard",
"filter": "dbl_metaphone"
},
"dbl_metaphone_given_synonym": {
"tokenizer": "standard",
"filter": [
"given_synonyms",
"dbl_metaphone"
]
},
"dbl_metaphone_surname_synonym": {
"tokenizer": "standard",
"filter": [
"surname_synonyms",
"dbl_metaphone"
]
}
}
}
}
},
"mappings": {
"test": {
"_all": {
"enabled": false
},
"_source": {
"enabled": true
},
"properties": {
"GivenNames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_given_synonym"
}
}
},
"Surnames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_surname_synonym"
}
}
},
"FatherGivenNames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_given_synonym"
}
}
},
"FatherSurnames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_surname_synonym"
}
}
},
"MotherGivenNames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_given_synonym"
}
}
},
"MotherSurnames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_given_synonym"
}
}
},
"SpouseGivenNames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_given_synonym"
}
}
},
"SpouseSurnames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_surname_synonym"
}
}
},
"ChildrenGivenNames": {
"type": "keyword",
"index_options": "freqs",
"store": "false",
"similarity": "boolean",
"norms": "false",
"fields": {
"phonetic": {
"type": "text",
"analyzer": "dbl_metaphone",
"search_analyzer": "dbl_metaphone_given_synonym"
}
}
},
"BirthYears": {
"type": "short"
},
"BirthLocations": {
"type": "integer"
},
"DeathYears": {
"type": "short"
},
"DeathLocations": {
"type": "integer"
},
"MarriageLocations": {
"type": "integer"
},
"MarriageYears": {
"type": "integer"
},
"ResidenceLocations": {
"type": "integer"
}
}
}
}
}