Luceneのロジック構造ですが、コンテンツに検索結果が存在する場合に、ネストされたフィールドが強調表示されるようにしようとしています。
Elasticsearchのドキュメントからの説明は次のとおりです(ネストされた型のマッピング`)
内部実装
内部的には、ネストされたオブジェクトは追加のドキュメントとしてインデックス化されますが、同じ「ブロック」内でインデックス化されることが保証されるため、親ドキュメントとの結合が非常に高速になります。
これらの内部のネストされたドキュメントは、インデックスに対する操作 (match_all クエリを使用した検索など) を実行するときに自動的にマスクされ、ネストされたクエリを使用するとバブルアウトします。
ネストされたドキュメントは常に親ドキュメントにマスクされるため、ネストされたドキュメントはネストされたクエリの範囲外では決してアクセスできません。たとえば、格納されたフィールドは、ネストされたオブジェクト内のフィールドで有効にすることができますが、格納されたフィールドはネストされたクエリ スコープの外でフェッチされるため、それらを取得する方法はありません。
0.私の場合
次のようなマッピングを含むElasticsearchインデックスがあります。
{
"my_documents": {
"dynamic_date_formats": [
"dd.MM.yyyy",
"yyyy-MM-dd",
"yyyy-MM-dd HH:mm:ss"
],
"index_analyzer": "Analyzer2_index",
"search_analyzer": "Analyzer2_search_decompound",
"_timestamp": {
"enabled": true
},
"properties": {
"identifier": {
"type": "string"
},
"description": {
"type": "multi_field",
"fields": {
"sort": {
"type": "string",
"index": "not_analyzed"
},
"description": {
"type": "string"
}
}
},
"files": {
"type": "nested",
"include_in_root": true,
"properties": {
"content": {
"type": "string",
"include_in_root": true
}
}
},
"and then some other": "normal string fields"
}
}
}
次のようなクエリを実行しようとしています。
{
"size": 100,
"query": {
"bool": {
"should": [
{
"nested": {
"path": "files",
"query": {
"bool": {
"should": {
"match": {
"content": {
"query": "burpcontrol",
"minimum_should_match": "85%"
}
}
}
}
}
}
},
{
"match": {
"description": {
"query": "burpcontrol",
"minimum_should_match": "85%"
}
}
},
{
"match": {
"identifier": {
"query": "burpcontrol",
"minimum_should_match": "85%"
}
}
} ]
}
},
"highlight": {
"pre_tags": [
"<span style=\"background-color: yellow\">"
],
"post_tags": [
"</span>"
],
"order": "score",
"no_match_size": 100,
"fragment_size": 50,
"number_of_fragments": 3,
"require_field_match": true,
"fields": {
"files.content": {},
"description": {},
"identifier": {}
}
}
}
私が抱えている問題は次のとおりです。
1.require_field_match
使用する"require_field_match": false
と、ネストされたフィールドで強調表示が機能しない場合でも、すべてのフィールドで検索語が強調表示されます。これは私が実際に使用しているソリューションですが、パフォーマンスはひどいものです。50 個のドキュメントの場合、クエリには 25 秒必要です。約50秒で100枚。10 文書 5 秒。
そして、ネストされたフィールドを強調表示から削除すると、すべてが光のように高速に機能します!
2 .include_in_root
ネストされたフィールドのフラット化されたバージョンが必要です(通常のオブジェクト/フィールドとして保存するためです。これを行うには、指定する必要があります
"files": { "type": "nested", " include_in_root ": true, ...
しかし、インデックスを再作成した後、ドキュメントルートに追加のフラット化されたフィールドが表示されない理由はわかりません(のようなものを期待していました"files.content":["content1", "content2", "..."]
)。
それが機能する場合は、ネストされたフィールドの内容に (フラット化されたフィールドで) アクセスし、その内容を強調表示することができます。