
創作人:李增勝
在某些業務下,設計索引 Mapping 時,需要設計的對象中包含對象(非數組),此時就可以使用 Object 類型來存儲對象。
以下定義了店鋪對象,包含店鋪名稱、店鋪編碼、供應商資訊,另外供應商資訊中又包含供應商編碼、供應商名稱,同時供應商資訊還包含自身的對象屬性所在區域,所在區域又包含省和市,這種定義才能滿足查詢店鋪資訊、查詢供應商所有店鋪資訊,以及查詢某地區的所有店鋪資訊等等場景。
在如下示例中,supplier 是索引 my_shop 中的一個 Object,area 又是 supplier 的一個 Object
在通路 area 時,需要通過 supplier.area 才能通路
#定義 mapping
PUT my_shop
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 1
}
},
"mappings": {
"properties": {
"shopName": {
"type": "text",
"analyzer": "ik_smart"
},
"shopCode": {
"type": "keyword"
},
"supplier": {
"properties": {
"supplier_code": {
"type": "keyword"
},
"supplier_name": {
"type": "text",
"analyzer": "ik_smart"
},
"area": {
"properties": {
"province": {
"type": "keyword"
},
"city": {
"type": "keyword"
}
}
}
}
}
}
}
}
#插入測試資料
POST my_shop/_bulk
{"index":{"_id":1}}
{"shopName":"蘋果熱銷店鋪","shopCode":"sc001","supplier":{"supplier_code":"001","supplier_name":"南京農村電商上司者","area":{"province":"江蘇省","city":"南京市"}}}
{"index":{"_id":2}}
{"shopName":"美的熱銷店鋪","shopCode":"sc002","supplier":{"supplier_code":"001","supplier_name":"南京農村電商上司者","area":{"province":"江蘇省","city":"南京市"}}}
{"index":{"_id":3}}
{"shopName":"金沙酒熱銷店鋪","shopCode":"sc003","supplier":{"supplier_code":"002","supplier_name":"山東農村電商上司者","area":{"province":"江蘇省","city":"南京市"}}}
{"index":{"_id":4}}
{"shopName":"華為熱銷店鋪","shopCode":"sc004","supplier":{"supplier_code":"002","supplier_name":"山東農村電商上司者","area":{"province":"山東省","city":"青島市"}}}
測試資料包括2家供應商
- 南京農村電商上司者 店鋪:蘋果熱銷店鋪 + 美的熱銷店鋪
- 山東農村電商上司者 店鋪:金沙酒熱銷店鋪 + 華為熱銷店鋪
查詢供應商 001 對應的所有店鋪:
#通路時,需要supplier.supplier_code指定對象對應的字段
POST my_shop/_search
{
"query": {
"match": {
"supplier.supplier_code": "001"
}
}
}
#傳回
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.6931471,
"hits" : [
{
"_index" : "my_shop",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.6931471,
"_source" : {
"shopName" : "蘋果熱銷店鋪",
"shopCode" : "sc001",
"supplier" : {
"supplier_code" : "001",
"supplier_name" : "南京農村電商上司者",
"area" : {
"province" : "江蘇省",
"city" : "南京市"
}
}
}
},
{
"_index" : "my_shop",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.6931471,
"_source" : {
"shopName" : "美的熱銷店鋪",
"shopCode" : "sc002",
"supplier" : {
"supplier_code" : "001",
"supplier_name" : "南京農村電商上司者",
"area" : {
"province" : "江蘇省",
"city" : "南京市"
}
}
}
}
]
}
}
#查詢銷售區域在南京的所有店鋪
#通過 supplier.area.city 通路對應的字段值
POST my_shop/_search
{
"query": {
"match": {
"supplier.area.city": "南京市"
}
}
}
#傳回
{
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 0.35667494,
"hits" : [
{
"_index" : "my_shop",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.35667494,
"_source" : {
"shopName" : "蘋果熱銷店鋪",
"shopCode" : "sc001",
"supplier" : {
"supplier_code" : "001",
"supplier_name" : "南京農村電商上司者",
"area" : {
"province" : "江蘇省",
"city" : "南京市"
}
}
}
},
{
"_index" : "my_shop",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.35667494,
"_source" : {
"shopName" : "美的熱銷店鋪",
"shopCode" : "sc002",
"supplier" : {
"supplier_code" : "001",
"supplier_name" : "南京農村電商上司者",
"area" : {
"province" : "江蘇省",
"city" : "南京市"
}
}
}
},
{
"_index" : "my_shop",
"_type" : "_doc",
"_id" : "3",
"_score" : 0.35667494,
"_source" : {
"shopName" : "金沙酒熱銷店鋪",
"shopCode" : "sc003",
"supplier" : {
"supplier_code" : "002",
"supplier_name" : "山東農村電商上司者",
"area" : {
"province" : "江蘇省",
"city" : "南京市"
}
}
}
}
]
}
}