Как получить оригинальное слово для выделенного синонима вasticsearch - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть конкретный 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": {}
    }
  }
}
...