Highlight слова в nested поле используя словоформы

Здравствуйте. У меня есть индекс товаров (products) где используется поле описание (descriptions) в виде массива объектов, так как один товар имеет несколько описаний для разных сайтов.

Есть задача поиска по описаниям, и подсветка найденных фраз.

Я установил плагин GitHub - imotov/elasticsearch-analysis-morphology: Morphological Analysis Plugin for ElasticSearch (No longer maintained) и внес при создании индекса соотвествующие настройки. Когда я делаю поиск по nested полю, поиск находит только точные совпадения.

GET products/_search
{
  "query": { 
    "bool": { 
      "should": [
        {
          "nested": {
            "path": "descriptions", 
            "query": {
              "bool": {
                "should": [ 
                  {
                    "match": {
                      "descriptions.description": "плесенью"
                    }
                  }
                ],
                "filter": [ 
                  { "term":  { "descriptions.domain_id": 3 }}
                ]
              }
            },
            "inner_hits": { 
              "highlight": {
                "fields": {
                  "descriptions.description": {}
                }
              }
            }
          }
        }
      ],
      "minimum_should_match" : 1
    }
  }
}

выдаст подобные результаты:

хорошо справляются с вредителями и плесенью, но всё...

но проигнорирует все варианты с подобными фразами

Интересное действие; Особая устойчивость к плесени

Есть ли возможно подсвечивать такие слова с другим окончанием?

Проанализировав работу поиска, понял что вообще не реагирует на любые неточные совпадения.

Создал для тестов еще 1 индекс articles и задал настройки из документации https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#russian-analyzer

после добавления в индекс статей, он ищет только точные совпадения.

GET /articles/_search
{
    "query": {
        "match" : {
            "title" : "форум"
        }
    }
}

Вернет только точные совпадения слова форум.

другой запрос:

GET /articles/_search
{
    "query": {
        "match" : {
            "title" : "форумы"
        }
    }
}

вернет совершенно другие запросы.

Настройки индекса:

{
  "articles": {
    "settings": {
      "index": {
        "number_of_shards": "5",
        "provided_name": "articles",
        "creation_date": "1494760778489",
        "analysis": {
          "filter": {
            "russian_stemmer": {
              "type": "stemmer",
              "language": "russian"
            },
            "russian_stop": {
              "type": "stop",
              "stopwords": "_russian_"
            },
            "russian_keywords": {
              "keywords": [
                "пример"
              ],
              "type": "keyword_marker"
            }
          },
          "analyzer": {
            "russian": {
              "filter": [
                "lowercase",
                "russian_stop",
                "russian_keywords",
                "russian_stemmer"
              ],
              "tokenizer": "standard"
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "e1SEV5koQT-EPBO8bsr6Rg",
        "version": {
          "created": "5030099"
        }
      }
    }
  }
}

не могли бы вы подсказать где моя ошибка?

еще немного информации:

GET articles/_analyze?pretty&analyzer=russian&text=форумы"

выдает

{
  "tokens": [
    {
      "token": "форум",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

если тут выглядит правильно то я не понимаю почему не находится статья со словом "форумы"

Я не вижу mapping, но судя по всему, Вы создали анализатор, но не указали для каких полей этот анализатор должен использоваться - в результате он не используется нигде.

1 Like

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.