Elasticsearch: FVH подсвечивает несколько тегов pre и post, помечающих маркеры неправильно? - PullRequest
3 голосов
/ 08 апреля 2019

Я запрашиваю свой индекс, используя логический запрос с двумя match терминами. Для каждого термина у меня есть отдельный набор пре- и пост-тегов. Используя основные моменты, я хотел бы получить документы, в которых существуют оба термина, и посмотреть, какие токены были сопоставлены с каждым из них. Указатель содержит документы на польском языке, проанализированные с использованием morfologik . Давайте назовем два термина, которые я ищу: aspect и feature. Я хочу сделать запрос к индексу и получить документы, в которых есть определенный аспект и функция, и хочу, чтобы функция highlight пометила маркер аспекта тегом <aspect>, а функцию - тегом <feature>. В большинстве случаев он работает, как и ожидалось, но иногда Elasticsearch помечает один или оба токена неправильно. Я приведу вам пример.

Итак, допустим, мой индекс содержит следующий документ:

"Najlepsza maseczka na zniszczone włosy!"

Если я ищу «maseczka» (аспект) и «dobry» (функция), я ожидаю, что результат будет таким:

"<feature>Najlepsza</feature> <aspect>maseczka</aspect> na zniszczone włosy! "

По некоторым причинам результаты Elasticsearch такие:

"<aspect>Najlepsza</aspect> <aspect>maseczka</aspect> na zniszczone włosy! "

Что я знаю до сих пор:

  • Я подумал, что, возможно, аспект и объект имеют аналогичную форму при анализе, но это не тот случай, например, _analyze для приведенного выше примера возвращает:
#query
GET my_index/_analyze
{
  "analyzer": "morfologik",
  "text": "dobra maseczka"
}

#results
{
  "tokens": [
    {
      "token": "dobra",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "dobro",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "dobry",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "maseczka",
      "start_offset": 6,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}
# Analysis of the document:
get my_index/_analyze
{
  "analyzer": "morfologik",
  "text": "Najlepsza maseczka na zniszczone włosy"
}
# response
{
  "tokens": [
    {
      "token": "dobry",
      "start_offset": 0,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "maseczka",
      "start_offset": 10,
      "end_offset": 18,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "na",
      "start_offset": 19,
      "end_offset": 21,
      "type": "<ALPHANUM>",
      "position": 2
    },
    ...
  ]
}
  • это также не проблема с определенным аспектом или функцией, потому что для некоторых запросов индекс будет возвращать как правильно, так и неправильно выделенные документы (поэтому я ожидаю, что это будет проблема с документами, а не с запросами)

  • в некоторых случаях оба термина выделены как аспекты, в некоторых аспектах помечены как элемент, а элемент как аспект, но я пока не нашел ни одного правила

  • Я подумал, что если мои термины поиска соответствуют порядку тегов подсветки, то первый термин всегда должен получать первый тег, а второй - всегда второй, но, может быть, они работают по-другому? Я думал, что вот как это работает, вдохновленный этим ответом :

    Используя Fast Vector Highlighter, вы можете указывать теги в порядке «важности», что, по-видимому, означает, что их порядок и порядок поисковых запросов должны совпадать.

Вот как создается мой индекс:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "morfologik": {
          "tokenizer": "standard",
          "filter": [
            "morfologik_stem",
            "lowercase"
          ],
          "type": "custom"
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "content": {
          "type": "text",
          "term_vector": "with_positions_offsets",
          "analyzer": "morfologik"
        },
        "original_doc": {
          "type": "integer"
        }
      }
    }
  }
}

Вот мой запрос:

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match" : { "content" : "maseczki" } }, 
        { "match" : { "content" : "dobre" } }
      ]
  }},
  "highlight": {
    "fields": {
      "content": {
        "fragment_size": 200,
        "type": "fvh",
        "pre_tags": ["<aspect>", "<feature>"],
        "post_tags": ["</aspect>", "</feature>"]
      }
    }
  }
}

А вот пример ответа:

{
        "_index": "my_index",
        "_type": "doc",
        "_id": "R91v7GkB0hUBqPARgC54",
        "_score": 16.864662,
        "_source": {
          "content": "Najlepsza maseczka na zniszczone włosy! ",
          "original_doc_id": 74290
        },
        "highlight": {
          "content": [
            "<aspect>Najlepsza</aspect> <aspect>maseczka</aspect> na zniszczone włosy! "
          ]
        }
      },

Как я уже говорил, большую часть времени запрос работает нормально, а иногда подсвечивание всех аспектов происходит только для подмножества конкретных результатов запроса, как это происходит в случае с "(opakowanie, solidne)":

  • аспект здесь на самом деле функция, а функция аспекта
<aspect>solidne</aspect>, naprawdę świetne <feature>opakowanie</feature>
  • solidne должен быть помечен как особенность здесь
Jedyne do czego mogłabym się przyczepić to <aspect>opakowanie</aspect> które wg mnie niestety nie jest <aspect>solidne</aspect>

1 Ответ

0 голосов
/ 20 апреля 2019

В моем понимании, если вы хотите сделать запрос на совпадение для строки, разделенной пробелами, вы должны использовать токенизатор как пробел .

Я бы посоветовал вам проверить этот токенизатор.https://www.elastic.co/guide/en/elasticsearch/reference/5.4/analysis-whitespace-tokenizer.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...