фильтр синонимов elasticsarch с анализатором английского языка

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

Это определение, которое я пробовал:

{
  "analysis": {
    "filter": {
      "synonym_en": {
        "type": "synonym",
        "synonyms": [
          "universe, cosmos",
          "women, woman",
          "man, men"
        ]
      },
      "my_filter": {
        "type": "word_delimiter",
        "preserve_original": "false",
        "split_on_numerics": "false"
      }
    },
    "analyzer": {
      "my_analyzer": {
        "type": "custom",
        "filter": [
          "my_filter"
        ],
        "tokenizer": "keyword"
      },
      "my_english": {
        "type": "english",
        "stopwords": [
          "a",
          "an",
          "and",
          "are",
          "as",
          "at",
          "be",
          "but",
          "by",
          "for",
          "if",
          "into",
          "is",
          "it",
          "of",
          "on",
          "or",
          "such",
          "that",
          "the",
          "their",
          "then",
          "there",
          "these",
          "they",
          "this",
          "to",
          "was",
          "will",
          "with"
        ],
        "filter": [
          "synonym_en"
        ]
      }
    }
  }
}

Однако я не смог заставить его работать буксиром. действительно, когда я запускаю пример:

GET /my_index/_analyze?analyzer=my_english&text='Men'

Он возвращает только токен men, в то время как я хотел бы иметь и man, и men.

Также обратите внимание, что более простой анализатор

{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym", 
          "synonyms": [ 
            "british,english",
            "queen,monarch",
            "man,men"
          ]
        }
      },
      "analyzer": {
        "my_synonyms": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_synonym_filter" 
          ]
        }
      }
    }
  }
}

Вроде работает, так как возвращает man и men.

Как я могу получить желаемое поведение + проистекающее из английского анализатора?


person Luca Fiaschi    schedule 20.11.2014    source источник


Ответы (1)


Это связано с тем, что синоним / фильтр не является подходящим параметром для настройки для "английского" анализатора. Есть разница между пользовательским анализатором и встроенный анализатор. Встроенные анализаторы позволяют настраивать только определенные параметры. т.е. в случае языковых анализаторов это стоп-слова , исключение основы. Остальные параметры псевдонима my_english для анализаторов английского языка просто игнорируется. Вероятно, более подходящим поведением здесь было бы выдача ошибки.

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

В любом случае, если вы хотите использовать фильтр синонимов с анализатором английского языка, вам необходимо создать собственный анализатор, который реализует анализатор английского языка, как указано здесь. Вы можете добавить к этому фильтр синонимов.

person keety    schedule 20.11.2014