Почему в 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
  } ]
}
  • Вопрос задан
  • 507 просмотров
Пригласить эксперта
Ответы на вопрос 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, но оказалось, что это не проблема морфологии.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы