Elasticsearch關聯關係

2021-09-27 11:40:54 字數 3527 閱讀 5628

elasticsearch父子關係

5.x參考

官網join介紹

es6.x一對多方案參考

注意:elasticsearch的關聯關係,必須要在同乙個索引裡面,而且父子關係必須在同乙個分片中。

es6.x版本規定乙個索引中只能有乙個type,這就導致了,父子關係就必須放在同乙個type中。

例子:本部落格,主要兩張表:

t_article(id,文章標題,摘要,分類)

t_article_contents(正文內容,t_article的id)。

select

*from

t_article t

left join t_article_contents t1 on t.id = t1.article_id

where

t.category_id = 1

and (

t.title like '%山%'

or t.summary like '%山%'

or t1.contents like '%山%'

)方案一:在業務層實現,

1.先t_article查詢category_id ==1的文章

2.查詢t_article_contents中contents有「山」,並article_id==步驟1的值

3.查詢t_article查詢category_id ==1,並且summary或title有「山」或id為步驟2的值

方案二:關聯查詢

由於這裡為了使用resthighlevel(es5.6開始支援),使用了es6.3.2版本,

確發現es6.x以上乙個index中只能有1個type。這就導致了t_article表和

t_article_contents表必須放在同乙個index,同乙個type。

方案三:巢狀json

將t_article_contents巢狀在t_article

}

注意:由於t_article和t_article_contents只能在同乙個type中。由於id就必須唯一.所以mysql中的id不能直接同在es中。

方案二

127.0.0.1:9200/blog/

, "join_field": }}

}}}

插入兩條父資料

127.0.0.1:9200/blog/t_article/1

}127.0.0.1:9200/blog/t_article/2

}//中文分詞器使用ik

127.0.0.1:9200/blog/

, "properties": ,

"join_field":

},"title":

,"summary":

,"contents": }}

}}建立資料時使用了routing=1引數,所以後續getbyid,update,delete都需要指定routing引數,否則es按照預設路由規則去找shard,自然找不到了。

為id==1的文章插入兩條子資料

127.0.0.1:9200/blog/t_article/3?routing=1

}127.0.0.1:9200/blog/t_article/4?routing=1}

使用 resthighlevel

org.elasticsearch

elasticsearch

6.3.2

org.elasticsearch.client

elasticsearch-rest-high-level-client

6.3.2

/*** 構建查詢資訊

* @return

*/public void buildsearchpage(modelandview mv,long categoryid,string searchkey) throws ioexception

轉成dsl}}

],"should": [}},

}},}},

"type": "t_article_contents",

"score_mode": "none",

"min_children": 0,

"max_children": 2147483647,

"boost": 1.0}}

],"adjust_pure_negative": true,

"boost": 1.0}}

],"adjust_pure_negative": true,

"boost": 1.0}},

"sort": [}]}

可以使用inner_hits在查詢父資料同時帶出子資料(或子帶出父)。

inner_hits預設只能查詢3條資料,需要查詢更多要自己設定from和size}},

"inner_hits":{},

"type": "t_article_contents",

"score_mode": "none",

"min_children": 0,

"max_children": 2147483647,

"boost": 1.0

}}

logstash匯入es關聯關係

input 

jdbc

}filter

join_field =

event.set("join_field",join_field)'}

json

json "

target =>"aaaaaa"

}mutate "

"join_field22" => "%"}}

}if [type] == "t_article_contents" "

} event.set("join_field",join_field)

'}

json

}}output "}}

if [type] == "t_article_contents" "

routing => "%"}}

}

刪除查詢的資料

post 

}}

方案三:巢狀json

不管是修改t_article還是修改t_article_contents都要全部取出來修改。

從mysql匯入es的時候要在兩張表的資料,整成巢狀json,可以使用外掛程式logstash-filter-aggregate

參考文章logstash-filter-aggregate

官網參考logstash-filter-aggregate

ElasticSearch關聯查詢

elasticsearch是乙個基於lucene的開源搜尋引擎,支援全文檢索,提供restful介面。在es中,提供了類似於mongodb 的面向文件儲存服務,這種面向文件的儲存非常靈活,但是文件與文件直接的關聯卻比較麻煩,mongodb裡面有dbref,elasticsearch裡 面卻沒有這個,...

ElasticSearch關聯查詢

elasticsearch是乙個基於lucene的開源搜尋引擎,支援全文檢索,提供restful介面。在es中,提供了類似於mongodb的面向文件儲存服務,這種面向文件的儲存非常靈活,但是文件與文件直接的關聯卻比較麻煩,mongodb裡面有dbref,elasticsearch裡面卻沒有這個,這篇...

elasticsearch關聯方式簡介

一 應用層連線 多索引,但是沒有資料顯示多個索引之間應該怎樣關聯,只能粗暴的當成乙個文件 params index type body json 二 非規範化資料 冗餘 將其他文件的資料統計出來,再根據關聯字段,將統計結果更新到本資料 問題 資料量大時,的的foreach一條一條更新,速度慢 三 巢...