highlightという機能で実装できます。
https://qiita.com/kaibadash@github/items/4a587336166c6096f835 ここで作ったTwitterのデータで試してみます。
クエリ
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"full_text": {
"query": "犬"
}
}
}
]
}
},
"highlight": {
"fields": {
"full_text": {}
}
}
}
日本語の設定をちゃんとしていないのであんまりなのですが…。
1つポイントがありまして、当然と言われればそうなのですが、ハイライト対象は検索しないと設定できません。
例えば、ついでにユーザ名にもハイライトを付けたいとして、 highlight
だけ追加してもだめです。
検索結果
curl -X POST -H "Content-Type: application/json" http://localhost:9200/tweet20191222/_search\?pretty -d @search.json | jq .hits.hits[].highlight.full_text
[
"@waketi <em>犬</em>、耳ペタ"
]
[
"<em>犬</em>シュール。塀の上から顔を出す<em>犬</em> https://t.co/Lz8jnRqtUu"
]
[
"@waketi 賢い<em>犬</em>リリエンタール"
]
[
"<em>犬</em>の散歩コースなうー。もう<em>犬</em>はいないけども。"
]
[
"@WG_koro 当方無<em>犬</em>。雑種か大型<em>犬</em>希望。一先ず<em>犬</em>合わせして音楽性を確認したく。"
]
[
"@yujinko <em>犬</em>プレイでした"
]
[
"@waketi <em>犬</em>だけにワン"
]
[
"@BYS777 <em>犬</em>のやつも!"
]
[
"<em>犬</em>がハンカチ食った><"
]
[
"@ipusiron <em>犬</em>かわいい"
]
雑にHTMLにしてみる。
その他、気をつける点
highlight
はしばしばパフォーマンスが悪くなります。
ハイライト対象のオフセットを制限するなどチューニングが必要になることもあります。
まとめ
- HTMLが得られるのでそれを使うことになる
- Elasticsearchで探してDBから再取得、というケースだと困る