Как правильно обрабатывать расширение синонимов из нескольких слов с помощьюasticsearch? - PullRequest
1 голос
/ 02 мая 2019

У меня есть следующее расширение синонимов:

suco => suco, refresco, bebida de soja

Я хочу, чтобы токен поиска был таким:

Поиск "suco de laranja" был бы токенизирован на ["suco"," laranja "," refresco "," bebida de soja "].

Но я получаю его токены для [" suco "," laranja "," refresco "," bebida "," soja ""].

Учтите, что слово" de"является стоп-словом.И я хочу, чтобы это игнорировалось в запросе, как «bebida de laranja» становится [«bebida», «laranja»].Но я не хочу, чтобы это учитывалось в токенизации синонимов, поэтому «bebida de soja» по-прежнему остается одним токеном «bebida de soja».

мои настройки:

{
    "settings":{
        "analysis":{
            "filter":{
                "synonym_br":{
                    "type":"synonym",
                    "synonyms":[
                        "suco => suco, refresco, bebida de soja"
                    ]
                },
                "brazilian_stop":{
                    "type":"stop",
                    "stopwords":"_brazilian_"
                }
            },
            "analyzer":{
                "synonyms":{
                    "filter":[
                        "synonym_br",
                        "lowercase",
                        "brazilian_stop",
                        "asciifolding"
                    ],
                    "type":"custom",
                    "tokenizer":"standard"
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 02 мая 2019

Я бы предложил вам внести следующие два изменения. Первый напрямую связан с вопросом, который вы задали, а второй - с предложением.

  1. Вместо того чтобы использовать расширение нескольких синонимов в одно слово, сделайте обратное, т. Е. Все синонимы указывают на синоним одного слова. Обратите внимание, что нет синонима, который является единым миром, набор для некоторой комбинации букв. Так, изменить "suco => suco, refresco, bebida de soja" на "suco, refresco, bebida de soja => suco"

  2. Изменить порядок фильтров в synonyms анализаторе. Поместите lowercase перед synonym_br. Это гарантирует, что регистр не повлияет на synonym_br фильтр токенов.

Итак, окончательные настройки будут:

{
  "settings": {
    "analysis": {
      "filter": {
        "synonym_br": {
          "type": "synonym",
          "synonyms": [
            "suco, refresco, bebida de soja => suco"
          ]
        },
        "brazilian_stop": {
          "type": "stop",
          "stopwords": "_brazilian_"
        }
      },
      "analyzer": {
        "synonyms": {
          "filter": [
            "lowercase",
            "synonym_br",
            "brazilian_stop",
            "asciifolding"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}

Как это работает?

Для ввода bebida de soja фильтр применяется в следующем порядке:

Input Filter        Result tokens
====================================
lowercase           bebida, de, soja
synonym_br          suco             <------- all the above tokens(including position) exactly matches a synonym
brazilian_stop      suco
asciifolding        suco

Давайте посмотрим brazilian_stop в действии. Для этого нам нужен ввод, который не соответствует синониму, но содержит de. Например. de soja:

Input Filter        Result tokens
=================================
lowercase           de, soja
synonym_br          de, soja  <------- none of the tokens (independently or combined(including position)) matches any synonym
brazilian_stop      suco      <------- de is removed as it is a stopword
asciifolding        suco
...