web-dev-qa-db-ja.com

Elasticsearchのネストされた複数一致クエリ

だから私の問題は基本的に説明されたものと同じ here ですが、それでもグループでは未解決のままです。

私のマッピング:

{
    "abstract": {
        "properties": {
            "summary": {
                "type": "string"
            }
        }
    },
    "authors": {
        "type": "nested",
        "properties": {
            "first_name": {
                "type": "string"
            },
            "last_name": {
                 "type": "string"
            }
        }
    }
}

そして、これらのフィールドの両方で全文検索を実行したいと思います。私の頭に浮かぶクエリは、残念ながら機能しませんが、次のようになります。

{
    "query": {
        "bool": {
            "should": [{
                "multi_match": {
                    "query": "higgs boson",
                    "fields": ["abstract.summary^5", "author.last_name^2"]
                }
            }]
        }
    }
}

ネストされたマッピングのため、authorsフィールドから結果が得られません。また、ネストされたプロパティを削除することはできません-集計に使用します。それを解決するためのエレガントなアイデアはありますか?

18
stpk

マッピングをinclude_in_root: trueを使用する次のマッピングに変更すると、元のクエリを使用できるようになります。

{
    "abstract": {
        "properties": {
            "summary": {
                "type": "string"
            }
        }
    },
    "authors": {
        "type": "nested",
        "include_in_root": true,
        "properties": {
            "first_name": {
                "type": "string"
            },
            "last_name": {
                 "type": "string"
            }
        }
    }
}

ネストされたフィールドとフラット化されたオブジェクトフィールドの両方として、内部オブジェクトにインデックスを付けることができます。これは、include_in_parentをtrueに設定することで実現できます。 - リンク

注:include_in_rootはelasticsearchの将来のバージョンではcopy_toを優先して廃止される可能性があります。

12
Aymeric

私がうまく管理できた唯一の解決策は、便利でもエレガントでもありませんが、どういうわけか機能しますが、次のようなクエリです。

"query": {
    "bool": {
        "should": [
            {
                "nested": {
                    "path": "authors",
                    "query": {
                        "multi_match": {
                            "query": "higgs",
                            "fields": ["last_name^2"]
                        }
                    }
                } 
            },
            {
                "multi_match": {
                    "query": "higgs",
                    "fields": ["abstract.summary^5"]
                }
            }
        ]
    }
}

別のクエリで設定されている場合、ブースティングが期待どおりに機能するかどうかもわかりません。どんな提案も歓迎します。

11
stpk