elasticsearch анализ синонимов, состоящих из нескольких слов, токенизированных ключевых слов

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

curl -XPOST "http://localhost:9200/test" -d'
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "my_syn_filt": {
            "type": "synonym",
            "synonyms": [
              "foo bar, fooo bar", 
              "bazzz, baz"
            ]
          }
        },
        "analyzer": {
          "my_synonyms": {
            "filter": [
              "lowercase",
              "my_syn_filt"
            ],
            "tokenizer": "keyword"
          }
        }
      }
    }
  }
}'

Теперь протестируйте с помощью _analyze API:

curl 'localhost:9200/test/_analyze?analyzer=my_synonyms&text=baz'

Вызов возвращает то, что я ожидал (такой же результат возвращается и для 'bazzz'):

{
  "tokens": [
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 3,
      "start_offset": 0,
      "token": "bazzz"
    },
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 3,
      "start_offset": 0,
      "token": "baz"
    }
  ]
}

Теперь, когда я пробую тот же вызов с текстом синонима из нескольких слов, API возвращает только один токен типа «слово», без синонимов:

curl 'localhost:9200/test/_analyze?analyzer=my_synonyms&text=foo+bar'

(возвращается)

{
  "tokens": [
    {
      "position": 1,
      "type": "word",
      "end_offset": 7,
      "start_offset": 0,
      "token": "foo bar"
    }
  ]
}

Почему API-интерфейс анализа не возвращает токены «foo bar» И «fooo bar» с типом SYNONYM?


person Jeff    schedule 08.08.2014    source источник


Ответы (1)


Ключ-значение "tokenizer": "keyword" ТАКЖЕ необходимо добавить в объявление фильтра my_syn_filt следующим образом:

curl -XPOST "http://localhost:9200/test" -d'
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "my_syn_filt": {
            "tokenizer": "keyword",
            "type": "synonym",
            "synonyms": [
              "foo bar, fooo bar", 
              "bazzz, baz"
            ]
          }
        },
        "analyzer": {
          "my_synonyms": {
            "filter": [
              "lowercase",
              "my_syn_filt"
            ],
            "tokenizer": "keyword"
          }
        }
      }
    }
  }
}'

При указанном выше сопоставлении API _analyze возвращает желаемые токены SYNONYM:

{
  "tokens": [
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 7,
      "start_offset": 0,
      "token": "foo bar"
    },
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 7,
      "start_offset": 0,
      "token": "fooo bar"
    }
  ]
}
person Jeff    schedule 13.08.2014
comment
Кто это заняло у меня время. Ваше здоровье! Я, наверное, использую там фильтр в нижнем регистре, пока я на нем - person haltabush; 21.04.2016
comment
Почему пользовательский фильтр может указывать токенизатор? Есть какие-нибудь документы, на которые можно сослаться? - person Folyd; 20.05.2016
comment
Не удалось найти ни одного документа:? - person haltabush; 14.12.2016