本投稿は、一つ前の「Elasticsearch多言語化その2」の補足。
ゴール
やりたい事は、以下のようなフィールドに対する検索結果のハイライトをすること。
- nested 型で、中身は複数の “attachment” 型
- attachment 型の “content” フィールドには、content.{ja,en,…} というサブフィールドを作成し、各言語毎の analyzer で処理する
マッピング定義は以下の通り。(elastic4s の DSL をそのままコピペしたが、まぁ大体理解してもらえるかと。)
val messageMapping = mapping("message").fields(
"title_v3" typed StringType fields(
"en" typed StringType analyzer "english",
"ja" typed StringType analyzer "ja_kuromoji_neologd",
),
"body_v3" typed StringType fields(
"en" typed StringType analyzer "english",
"ja" typed StringType analyzer "ja_kuromoji_neologd",
),
"attached_files_v3" nested (
"attached_file" typed AttachmentType fields (
"content" typed StringType fields(
"en" typed StringType analyzer "english" termVector ("with_positions_offsets") store (true),
"ja" typed StringType analyzer "ja_kuromoji_neologd" termVector ("with_positions_offsets") store (true),
)
)
) includeInRoot (true)
)
環境は以下の通り
- Elasticsearch 2.3.5
- Elasticsearch Mapper Attachments プラグインを使用
- elastic4s というライブラリ経由で Scala から使用
TL; DR
先に結論を書いておくと、以下の2つがうまくいった。
- nested 型のフィールドに include_in_root を指定し、検索時には通常のクエリーを実行
- 通常の nested 型のフィールドに対し、nested query を実行し、inner hits でハイライト対象フィールドを指定
どちらの場合も、 “term_vector”: “with_positions_offsets” と “store”: “true” は、attached_file.content.{ja,en} につける。
上手く行かなかったのは以下の方法。
- nested query を実行し、highlight query でも nested query を実行
以下、詳細に説明していく。
Continue reading Elasticsearch の nested 型のハイライト