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一條一條更新,速度慢 三 巢...