Я запрашиваю свой индекс, используя логический запрос с двумя 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>