今天,讓我們深入研究 has_child 查詢和 has_parent 查詢,這將幫助我們將 2 個不同的文檔組合到一個索引中,從而使我們能夠?qū)⑺鼈兣c關(guān)系關(guān)聯(lián)起來。 這樣做會對我們搜索相關(guān)文檔時有很大幫助。 在使用 has_child 及 has_parent 這種關(guān)系時,我們必須使用 join 數(shù)據(jù)類型。更多有關(guān) join 數(shù)據(jù)類型的介紹,請參考文章 “Elasticsearch: Join 數(shù)據(jù)類型”。在實(shí)際的使用時,我們必須注意的一點(diǎn)是:?join 不能跨索引,Elasticsearch 的重點(diǎn)在于速度,而傳統(tǒng) join 的運(yùn)行速度太慢。 因此,子文檔和父文檔都必須位于相同的索引和相同的分片中。
了解親子關(guān)系
Elasticsearch 中的父子關(guān)系涉及將一個索引中的文檔作為父項(xiàng)與另一索引中的文檔相關(guān)聯(lián)。 這種關(guān)系對于數(shù)據(jù)組織需要分層結(jié)構(gòu)、需要分層搜索的場景非常重要。 has_child 和 has_parent 查詢?yōu)槲覀兲峁┝嗽谶@些關(guān)系中輕松準(zhǔn)確地導(dǎo)航和搜索的選項(xiàng)。
has_child 查詢
has_child 查詢允許我們根據(jù)關(guān)聯(lián)子文檔的內(nèi)容搜索父文檔。 當(dāng)我們想根據(jù)孩子的屬性對父母進(jìn)行過濾或評分時,此查詢主要有用。
句法:
{
"query": {
"has_child": {
"type": "child_type",
"query": {
"match": {
"field": "value"
}
}
}
}
}
讓我們考慮一下,我們的 “fruits” 索引中有父子關(guān)系,其中每個 fruit 文檔都是父文檔,這些水果的 nutritional_info?信息存儲為子文檔。 has_child 查詢可用于查找具有特定營養(yǎng)價值的水果。
{
"query": {
"has_child": {
"type": "nutritional_info",
"query": {
"range": {
"vitamin_c": {
"gte": 20
}
}
}
}
}
}
{
"query": {
"has_child": {
"type": "nutritional_info",
"query": {
"range": {
"vitamin_c": {
"gte": 20
}
}
}
}
}
}
在此示例中,我們正在搜索具有子文檔(營養(yǎng)信息)的水果,其中維生素 C 含量大于或等于 20。
{
"query": {
"has_parent": {
"parent_type": "parent_type",
"query": {
"term": {
"field": "value"
}
}
}
}
}
在與我們上面使用的具有父子關(guān)系的 “Fruits” 索引相同的示例中,我們假設(shè)每個水果文檔都是父文檔,并且營養(yǎng)信息存儲為子文檔。 has_child 查詢可用于查找具有特定營養(yǎng)價值的水果。 這是一個例子:
{
"query": {
"has_child": {
"type": "nutritional_info",
"query": {
"range": {
"vitamin_c": {
"gte": 20
}
}
}
}
}
}
在此示例中,我們正在搜索具有子文檔(營養(yǎng)信息)的水果,其中維生素 C 含量大于或等于 20。
所以基本上 has_child 和 has_parent 查詢只是彼此的關(guān)系。
實(shí)時用例:
分層數(shù)據(jù)建模
讓我們考慮一個場景,我們正在對組織結(jié)構(gòu)或產(chǎn)品類別等分層數(shù)據(jù)進(jìn)行建模。 has_child 和 has_parent 查詢使我們能夠檢索層次結(jié)構(gòu)各個級別的相關(guān)信息,從而促進(jìn)高效的數(shù)據(jù)導(dǎo)航。
內(nèi)容過濾
在內(nèi)容管理系統(tǒng)中,我們可能有代表文章的父文檔和代表評論的子文檔。 利用 has_child 查詢,我們可以根據(jù)評論中的特定條件過濾文章,并為客戶提供精致的搜索體驗(yàn)。
雖然 has_child 和 has_parent 查詢?yōu)橄嚓P(guān)文檔搜索提供了強(qiáng)大的選項(xiàng),但我們應(yīng)該始終小心常見問題,例如索引之間的映射不一致、較大層次結(jié)構(gòu)的查詢性能問題等。
為了最大限度地提高 has_child 和 has_parent 查詢的有效性,我們應(yīng)該確保始終遵循以下最佳實(shí)踐。
- 索引設(shè)置:索引設(shè)置應(yīng)配置為支持有效的父子關(guān)系。 根據(jù)用例適當(dāng)調(diào)整 “index.mapping.single_type” 等設(shè)置。
- 查詢優(yōu)化:應(yīng)使用緩存和過濾等查詢優(yōu)化技術(shù)來增強(qiáng)搜索性能。
因此,如果這是用于理解 has_child 和 has_parent 查詢的入門知識,Elastic 的官方文檔可以幫助我們更多地了解有關(guān)相同內(nèi)容的更多詳細(xì)信息。文章來源:http://www.zghlxwxcb.cn/news/detail-783915.html
更多閱讀:Elasticsearch:在 Elasticsearch 中的 join 數(shù)據(jù)類型父子關(guān)系。文章來源地址http://www.zghlxwxcb.cn/news/detail-783915.html
到了這里,關(guān)于解碼 Elasticsearch 查詢 DSL:利用 Elasticsearch 中的 has_child 和 has_parent 查詢進(jìn)行父子文檔搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!