LoginSignup
3
4

More than 1 year has passed since last update.

Elasticsearchでヒットした部分に色を付けたい

Last updated at Posted at 2019-12-22

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にしてみる。

image.png

その他、気をつける点

highlight はしばしばパフォーマンスが悪くなります。
ハイライト対象のオフセットを制限するなどチューニングが必要になることもあります。

まとめ

  • HTMLが得られるのでそれを使うことになる
  • Elasticsearchで探してDBから再取得、というケースだと困る
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4