У меня есть конкретный c вариант использования, где я хочу знать, какое слово соответствует какому выделенному слову. Я хочу знать, есть ли способ в Elasticsearch получить оригинальное слово, соответствующее синониму в выделенной строке? Таким образом, в основном, если моя исходная строка «banaglore hotels» и я создал синоним bangalore => bengaluru, при поиске benagluru выделенная строка из ответа на запрос ES будет выглядеть так:
banaglore hotels
Поскольку синонимы упоминаются непосредственно в индексе, у меня нет возможности узнать, является ли bengaluru синонимом banaglore в моем приложении. Я использую индексное отображение:
{
"test_index": {
"settings": {
"index": {
"analysis": {
"filter": {
"ngram_filter": {
"type": "edge_ngram",
"min_gram": "1",
"max_gram": "20"
},
"synonym": {
"type": "synonym",
"synonyms": [
"bangalore=>bangalore,bengaluru,bengalooru,bangaluru,bengalore,banglore",
"mumbai=>mumbai,bombay,mumbay,new mumbai",
"delhi=>delhi,new delhi,dehli,dilli,newdelhi,deli,dili",
"new york=>new york,newyork, bigapple, big apple",
]
}
},
"normalizer": {
"lowercase_normalizer": {
"filter": [
"lowercase"
],
"type": "custom"
}
},
"analyzer": {
"ngram_analyzer": {
"filter": [
"lowercase",
"synonym",
"ngram_filter",
"asciifolding"
],
"type": "custom",
"tokenizer": "punctuation"
},
"search_analyzer": {
"filter": [
"lowercase",
"asciifolding"
],
"type": "custom",
"tokenizer": "punctuation"
}
},
"tokenizer": {
"punctuation": {
"pattern": "[ .,!?']",
"type": "pattern"
}
}
}
}
},
"mappings": {
"test": {
"properties": {
"ngramTexts": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "search_analyzer"
}
}
}
}
}
}
И запрос, который я делаю:
{
"size": 10,
"query": {
"bool": {
"must": [
{
"match": {
"ngramTexts": {
"query": "bengaluru",
"fuzziness": "0",
"prefix_length": 1,
"fuzzy_transpositions": true,
"auto_generate_synonyms_phrase_query": true
}
}
}
]
}
},
"highlight": {
"fields": {
"ngramTexts": {}
}
}
}