синонимы elasticsearch и конфликт черепицы

Позвольте мне сразу перейти к коду.

PUT /test_1
{
  "settings": {
    "analysis": {
      "filter": {
        "synonym": {
          "type": "synonym",
          "synonyms": [
            "university of tokyo => university_of_tokyo, u_tokyo",
            "university" => "college, educational_institute, school"
          ],
          "tokenizer": "whitespace"
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "whitespace",
          "filter": [
            "shingle",
            "synonym"
          ]
        }
      }
    }
  }
}

выход

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Token filter [shingle] cannot be used to parse synonyms"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Token filter [shingle] cannot be used to parse synonyms"
  },
  "status": 400
}


По сути,
Допустим, у меня есть следующие синонимы index_time

"university => university, college, educational_institute, school"
"tokyo => tokyo, japan_capitol"
"university of tokyo => university_of_tokyo, u_tokyo"

Если я ищу "колледж", я ожидаю найти "университет Токио"
, но поскольку индекс содержит только "университет Токио" => University_of_tokyo, u_tokyo.....поиск не работает


Я ожидал, что буду использовать Analyzer{'filter': ["single", "synonym"]}

university of tokyo -shingle-> university -synonyms-> college, institue


Как добиться желаемого поведения?


person Kaushik J    schedule 11.06.2020    source источник


Ответы (2)


У меня была похожая ошибка, хотя я использовал график синонимов....

Я попытался использовать lenient=true в определении графа синонимов и избавился от ошибки. Не уверен, что есть минус....

 "graph_synonyms" : {
                        "lenient": "true",       
                        "type" : "synonym_graph",
                        "synonyms_path" : "synonyms.txt"
            },
person user8378880    schedule 09.07.2020

Согласно этой link, токенизаторы должны создавать отдельные токены перед фильтром синонимов.

Но чтобы ответить на вашу проблему, прежде всего, ваше второе правило должно быть изменено так, чтобы все термины были синонимами.

university , college, educational_institute, school

Во-вторых, из-за подчеркивания в хвосте первого правила (university_of_tokyo) все вхождения tokyo University индексируются как University_of_tokyo, который не знает своих отдельных токенов. Чтобы преодолеть эту проблему, я бы предложил фильтр символов с таким правилом:

university of tokyo => university_of_tokyo university of tokyo

а затем в вашем правиле синонимов:

university_of_tokyo , u_tokyo

Это также способ справиться с проблемой многозначных синонимов.

person Ali Asghar Taghizadeh    schedule 30.09.2020