08.join查询
文章目錄
- 1. jion查詢簡介
- 2. nested mapping對應(yīng)的查詢
- 1.使用樣例簡介
- 2.多層級的nested query
- 3. join field的使用
- 1. has_child 查詢簡介
- 1. 排序sort
- 2. has_parent查詢簡介
- 1. 排序sort
- 3. parent id查詢
1. jion查詢簡介
join查詢主要是針對有parent/child文檔查詢的需求,parent和child是兩個獨(dú)立存儲的doc,在es中有兩種mapping可以實現(xiàn),一種是nested mapping,一種是join mapping
2. nested mapping對應(yīng)的查詢
1.使用樣例簡介
PUT /my-index-000001 {"mappings": {"properties": {"obj1": {"type": "nested"}}} } GET /my-index-000001/_search {"query": {"nested": {"path": "obj1","query": {"bool": {"must": [{ "match": { "obj1.name": "blue" } },{ "range": { "obj1.count": { "gt": 5 } } }]}},"score_mode": "avg"}} }可以有的參數(shù)
path: 要查詢的nested object的屬性路徑
query: 想要在nested object中進(jìn)行的查詢,如果查到了,會返回root parent doc.
score_mode: 如果一個nested query 命中了root parent doc中的多個child,那么root parent doc的得分如果通過這些child計算出來,
avg: (默認(rèn))所有child的平均值
max: max(child_score)
min: min(child_score)
mone: parent doc的score設(shè)置為0
sum: sum(child_score)
ignore_unmapped:忽略unmapped path, 默認(rèn)為false,在path是一個unmapped field的時候會報錯
2.多層級的nested query
PUT /drivers {"mappings": {"properties": {"driver": {"type": "nested","properties": {"last_name": {"type": "text"},"vehicle": {"type": "nested","properties": {"make": {"type": "text"},"model": {"type": "text"}}}}}}} } PUT /drivers/_doc/1 {"driver" : {"last_name" : "McQueen","vehicle" : [{"make" : "Powell Motors","model" : "Canyonero"},{"make" : "Miller-Meteor","model" : "Ecto-1"}]} }PUT /drivers/_doc/2?refresh {"driver" : {"last_name" : "Hudson","vehicle" : [{"make" : "Mifune","model" : "Mach Five"},{"make" : "Miller-Meteor","model" : "Ecto-1"}]} }執(zhí)行查詢
GET /drivers/_search {"query": {"nested": {"path": "driver","query": {"nested": {"path": "driver.vehicle","query": {"bool": {"must": [{ "match": { "driver.vehicle.make": "Powell Motors" } },{ "match": { "driver.vehicle.model": "Canyonero" } }]}}}}}} }response
{"took" : 5,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 3.7349272,"hits" : [{"_index" : "drivers","_type" : "_doc","_id" : "1","_score" : 3.7349272,"_source" : {"driver" : {"last_name" : "McQueen","vehicle" : [{"make" : "Powell Motors","model" : "Canyonero"},{"make" : "Miller-Meteor","model" : "Ecto-1"}]}}}]} }3. join field的使用
1. has_child 查詢簡介
has_child查詢需要通過join mapping的field來進(jìn)行支持,這個查詢主要是查詢擁有某些child的parent文檔
PUT /my-index-000001 {"mappings": {"properties": {"my-join-field": {"type": "join","relations": {"parent": "child" # 這里可以是任何字符串,前面的代表parent,后面的代表child}}}} } GET /_search {"query": {"has_child": {"type": "child","query": {"match_all": {}},"max_children": 10,"min_children": 2,"score_mode": "min"}} }這個文檔因為對child的查詢是match_all,所以會返回所有有child的parent doc。
參數(shù)
type: join field中child的名字(這里剛好也定義為了child,可以是是任何字符串)
query: 想要查詢的child,會返回這些child 對應(yīng)的parent doc
max_child: 設(shè)置的話則parent的child數(shù)量不能超過這個值
min_child: 設(shè)置的話則parent的child數(shù)量要大于這個值
score_mode: 如果一個 query 命中了parent doc中的多個child,那么 parent doc的得分如果通過這些child計算出來,
avg: (默認(rèn))所有child的平均值
max: max(child_score)
min: min(child_score)
mone: parent doc的score設(shè)置為0
sum: sum(child_score)
1. 排序sort
如果想要排序的話,只能使用function_score 來通過_score排序, 不能用正常的sort語法
GET /_search {"query": {"has_child": {"type": "child","query": {"function_score": {"script_score": {"script": "_score * doc['click_count'].value"}}},"score_mode": "max"}} }2. has_parent查詢簡介
has_parent查詢需要通過join mapping的field來進(jìn)行支持,這個查詢主要是查詢擁有某些parent的child文檔
PUT /my-index-000001 {"mappings": {"properties": {"my-join-field": {"type": "join","relations": {"parent": "child"}},"tag": {"type": "keyword"}}} } GET /my-index-000001/_search {"query": {"has_parent": {"parent_type": "parent","query": {"term": {"tag": {"value": "Elasticsearch"}}}}} }會在parent中查詢tag value為Elasticsearch 的doc,然后查詢這些doc對應(yīng)的child doc
參數(shù)
type: join field中parent的名字(這里剛好也定義為了parent,可以是是任何字符串)
query: 想要查詢的parent,會返回這些parent 對應(yīng)的parent doc
score: 默認(rèn)是false,false的話會忽略parent的相關(guān)性得分,ture的話parent的相關(guān)性得分會給child使用
1. 排序sort
如果想要排序的話,只能使用function_score 來通過_score排序, 不能用正常的sort語法
GET /_search {"query": {"has_parent": {"parent_type": "parent","score": true,"query": {"function_score": {"script_score": {"script": "_score * doc['view_count'].value"}}}}} }3. parent id查詢
PUT /my-index-000001 {"mappings": {"properties": {"my-join-field": {"type": "join","relations": {"my-parent": "my-child"}}}} } PUT /my-index-000001/_doc/1?refresh {"text": "This is a parent document.","my-join-field": "my-parent" } PUT /my-index-000001/_doc/2?routing=1&refresh {"text": "This is a child document.","my_join_field": {"name": "my-child","parent": "1"} } GET /my-index-000001/_search {"query": {"parent_id": {"type": "my-child","id": "1"}} }type: 關(guān)系中child的名稱
id: parent doc的id
返回對應(yīng)的parent的child doc集合
總結(jié)
- 上一篇: 07.full text query_
- 下一篇: 01.cluster模块综述