# 將Markdown文件上傳到博客園 # 1.下載python 下載地址為:http://npm.taobao.org/mirrors/python/ 安裝為3.10.11版本 在cmd視窗輸入python,彈出以下視窗為安裝成功 ![image-20230816102551883](https: ...
flattened:比如你有一個欄位的值是一個json,這個json裡面又有很多欄位,你又不想一個一個的定義這些欄位到mapping,就可以用flattened
直接動手:創建索引:
PUT person { "mappings": { "properties": { "patient_name": { "type": "text" }, "detail": { "type": "flattened" } } } }
註意這裡detail欄位類型為flattened, 然後插入文檔:
PUT person/_doc/1 { "patient_name": "John Doe", "detail": { "age": 143, "skills": [ "java", "python", "ai" ], "history": "none", "friends": [ "Neo", "James", "Tony Stark" ] } }
然後搜索:
GET person/_search { "query": { "match": { "detail": "java" } } }
註意這裡直接搜索detail,可以搜索到我們剛剛插入的那個文檔,但是我們也可以搜索detail.skills,比如
"detail.skills": "java"
也能搜索到那個文檔,但是如果我們這樣搜索就搜索不到:
"detail.friends": "java"
還有一點,這裡的每個欄位會被定義成keyword類型,所以你如果這樣搜索就搜索不到:
"detail.friends": "Tony"
你必須完全匹配才能搜索的到:
"detail.friends": "Tony Stark"
再來看看join類型,說的是一個索引裡面一個文檔和其他幾個文檔有關聯,比如幾個文檔的父文檔都是那一個文檔,動手:
先創建索引:
PUT person2 { "mappings": { "properties": { "relationship": { "type": "join", "relations": { "star": "fans" } } } } }
這裡relationship是一個欄位名,類型是join,指的明星和粉絲的關係,所以裡面有一個類型的參數relations,它的取值star:fans分別表示父和子的關聯類型,後面會用到。
插入文檔,首先是父文檔:
PUT person2/_doc/1 { "name": "star1", "relationship": { "name": "star" } }
這裡的relationship.name是star,這個值是在前面mapping裡面定義的,前面提到過,如果你寫個super_star,就會報錯:
unknown join name [super_star] for field [relationship]
然後插入第一個子文檔:
PUT person2/_doc/2?routing=tony { "name":"fan1", "relationship":{ "name":"fans", "parent":1 } }
註意這裡有個routing參數,如果插入子文檔的時候沒有指定routing是會報錯的,這是為了將相關的文檔分配到相同的分片,比如後面插入第二個子文檔真愛粉的時候也指定相同的路由參數值。
[routing] is missing for join field [relationship]
還有這裡的relationship.name是fans,也是在前面mapping裡面定義的。
指定parent是1,就確定了父子文檔的關係。
最後插入第二個子文檔:
PUT person2/_doc/3?routing=tony { "name":"fan2", "relationship":{ "name":"fans", "parent":1 } }
路由參數一樣,下麵查詢:
GET person2/_search { "query": { "parent_id": { "type": "fans", "id": 1 } } }
可以查到兩個子文檔,兩個子文檔,但是不包括父文檔:
"hits" : [ { ..."_routing" : "tony", "_source" : { "name" : "fan1", "relationship" : { "name" : "fans", "parent" : 1 } } }, { ..."_routing" : "tony", "_source" : { "name" : "fan2", "relationship" : { "name" : "fans", "parent" : 1 } } }
如果插入第二個子文檔的時候指定路由參數是neo,也可以搜索到兩個子文檔,不影響搜索,但不建議這樣做。
PUT person2/_doc/3?routing=neo
還有要註意的是如果查詢的時候,指定parent_id.type為star會報錯:
GET person2/_search { "query": { "parent_id": { "type": "star", "id": 1 } } }
報錯如下:
[parent_id] no relation found for child [star]
也就是說這裡要指定的是子文檔的關聯類型