Почему в Elasticsearch неправильно ищутся некоторые слова?

Использую плагин russian_morphology.

Фамилию "петрова" анализатор превращает в токен "петров", а фамилию "петров" в "петров" и "петр". Тут все норм, так и должно быть.
А есть другая фамилия - "аккуратова", она превращяется в "аккуратов", а таже фамилия в именительном падеже мужского рода "аккуратов" превращяется в "аккурат". И тут возникает проблема. По запросу "аккуратов" мы не сможем найти например фразу "портрет Аккуратова".

Ниже настройки и примеры запросов к анализатору.

"settings" : {
      "index" : {
        "analysis" : {
          "filter" : {
            "my_stopwords" : {
              "type" : "stop",
              "stopwords" : "а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это,я"
            }
          },
          "char_filter" : {
            "my_charfilter" : {
              "type" : "mapping",
              "mappings" : [ "Ё=>Е", "ё=>е" ]
            }
          },
          "analyzer" : {
            "my_analyzer" : {
              "filter" : [ "lowercase", "russian_morphology", "my_stopwords" ],
              "char_filter" : [ "my_charfilter" ],
              "type" : "custom",
              "tokenizer" : "standard"
            }
          }
        },


$ curl -XGET 'localhost:9200/myindex/_analyze?pretty&tokenizer=standard&token_filters=russian_morphology' -d 'петрова'
{
  "tokens" : [ {
    "token" : "петров",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "<ALPHANUM>",
    "position" : 1
  } ]
}

$ curl -XGET 'localhost:9200/myindex/_analyze?pretty&tokenizer=standard&token_filters=russian_morphology' -d 'петров'
{
  "tokens" : [ {
    "token" : "петров",
    "start_offset" : 0,
    "end_offset" : 6,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "петр",
    "start_offset" : 0,
    "end_offset" : 6,
    "type" : "<ALPHANUM>",
    "position" : 1
  } ]
}


$ curl -XGET 'localhost:9200/myindex/_analyze?pretty&tokenizer=standard&token_filters=russian_morphology' -d 'аккуратов'
{
  "tokens" : [ {
    "token" : "аккурат",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "<ALPHANUM>",
    "position" : 1
  } ]
}


$ curl -XGET 'localhost:9200/myindex/_analyze?pretty&tokenizer=standard&token_filters=russian_morphology' -d 'аккуратова'
{
  "tokens" : [ {
    "token" : "аккуратов",
    "start_offset" : 0,
    "end_offset" : 10,
    "type" : "<ALPHANUM>",
    "position" : 1
  } ]
}
  • Вопрос задан
  • 519 просмотров
Пригласить эксперта
Ответы на вопрос 1
AlexXYZ
@AlexXYZ
O Keep Clear O
Не совсем ответ, но есть форум, где осуждают проблемы с ES и морфологией в частности на русском (если существенно): https://discuss.elastic.co/c/in-your-native-tongue...

И стоит посмотреть issue проекта этого плагина (больше закрытые, т.к. по открытым нет ответов):
https://github.com/imotov/elasticsearch-analysis-m...
cdc966297e6b49d98b84b76618bcfc7b.png

Автор плагина Игорь Мотов, я ему задавал вопросы.
У меня была близкая проблема при использовании wildcard, но оказалось, что это не проблема морфологии.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
SpectrumData Екатеринбург
от 300 000 до 400 000 ₽
LIME Москва
от 280 000 до 350 000 ₽
24 нояб. 2024, в 01:35
5000 руб./за проект
24 нояб. 2024, в 01:25
1000 руб./за проект
24 нояб. 2024, в 01:24
500 руб./за проект