Выделите весь контент в Elasticsearch для многозначных полей
Использование подсветки Elasticsearch:
"highlight": {
"fields": {
"tags": { "number_of_fragments": 0 }
}
}
С number_of_fragments: 0
не создаются фрагменты, но возвращается все содержимое поля. Это полезно для коротких текстов, поскольку документы могут отображаться как обычно, и люди могут легко сканировать выделенные части.
Как вы используете это, когда документ содержит массив с несколькими значениями?
PUT /test/doc/1
{
"tags": [
"one hit tag",
"two foo tag",
"three hit tag",
"four foo tag"
]
}
GET /test/doc/_search
{
"query": {
"match": { "tags": "hit"}
},
"highlight": {
"fields": {
"tags": { "number_of_fragments": 0 }
}
}
}
Теперь, что бы я хотел показать пользователю:
1 результат:
Документ 1, помеченный:
"один хит тег", "два тега foo", "три тега хит", "четыре тега foo"
К сожалению, это результат запроса:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.10848885,
"hits": [
{
"_index": "test",
"_type": "doc",
"_id": "1",
"_score": 0.10848885,
"_source": {
"tags": [
"one hit tag",
"two foo tag",
"three hit tag",
"four foo tag"
]
},
"highlight": {
"tags": [
"one <em>hit</em> tag",
"three <em>hit</em> tag"
]
}
}
]
}
}
Как я могу использовать это, чтобы добраться до:
"tags": [
"one <em>hit</em> tag",
"two foo tag",
"three <em>hit</em> tag",
"four foo tag"
]
Ответы
Ответ 1
Одна из возможностей - удалить теги <em>
html из выделенных полей. Затем найдите их в исходном поле:
tags = [
"one hit tag",
"two foo tag",
"three hit tag",
"four foo tag"
]
highlighted = [
"one <em>hit</em> tag",
"three <em>hit</em> tag",
]
highlighted.each do |highlighted_tag|
if (index = tags.index(highlighted_tag.gsub(/<\/?em>/, '')))
tags[index] = highlighted_tag
end
end
puts tags #=>
# one <em>hit</em> tag
# two foo tag
# three <em>hit</em> tag
# four foo tag
Это не получает цену за самый красивый код, но я считаю, что он выполняет свою работу.