Задать вопрос

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

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

Похожие вопросы