天天看點

Object 資料類型— Elastic Stack 實戰手冊

Object 資料類型— Elastic Stack 實戰手冊
https://developer.aliyun.com/topic/download?id=1295 · 更多精彩内容,請下載下傳閱讀全本《Elastic Stack實戰手冊》 https://developer.aliyun.com/topic/download?id=1295 https://developer.aliyun.com/topic/es100 · 加入創作人行列,一起交流碰撞,參與技術圈年度盛事吧 https://developer.aliyun.com/topic/es100

創作人:李增勝

在某些業務下,設計索引 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家供應商

  1. 南京農村電商上司者 店鋪:蘋果熱銷店鋪 + 美的熱銷店鋪
  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" : "南京市"
            }
          }
        }
      }
    ]
  }
}