1. 程式人生 > >【程式設計】ElasticSearch更多的內容

【程式設計】ElasticSearch更多的內容

入門只是第一步,想要成功刪庫跑路,還有很長的路要走,學而時習之。這篇用於記錄入門之後遇到的更多狀況,待更新。

大家也可以點這裡,檢視雖然過時,但也有一定參考價值的Elasticsearch: 權威指南(中文版)

當然,英文好的小夥伴還是翻看和自己所使用的ElasticSearch相同的英文版本,進去之後找到自己關注的目錄點other version。

順便說一句我的示例程式碼是基於6.4.2的,有些部分可能有差別。

 

1、巢狀物件查詢nested/mapping

假如咱們要存的資料有更復雜的巢狀關係,比如物件中的一個屬性是一個新的物件陣列:

簡歷中的語言能力是一個物件組成的陣列:

POST my_index/resume/1

{

          "language" : [

                    {"class":"eng", "rank": 100},

                    {"class":"jap", "rank": 60},

                    {"class":"spa", "rank": 70}

          ],

          "name": "zhangsan"

}

試圖搜尋英文70分的人,卻會搜出英文100分、日文70分的文件。原因:戳這裡

GET my_index/resume/_search

{

          "query": {

                    "bool": {

                              "must": [

                                        {

                                                  "term": {

                                                            "language.class": {

                                                                      "value": "eng"

                                                            }

                                                  }

                                        },{

                                                  "term": {

                                                            "language.rank": {

                                                                      "value": "70"

                                                            }

                                                  }

                                        }

                              ]

                    }

          }

}

要想實現這樣複雜結構的搜尋,需要使用巢狀結構,先用mappings/nested來定義這個結構:

GET my_index/_mapping/resume

DELETE my_index

PUT my_index

{

          "mappings": {

                    "resume": {

                              "properties": {

                                        "language": {

                                                  "type": "nested",

                                                  "properties": {

                                                            "class": {"type": "text"},

                                                            "rank": {"type": "integer"}

                                                  }

                                        },

                                        "name":{

                                                  "type": "text"

                                        }

                              }

                    }

          }

}

再用nested關鍵字來搜尋:

GET my_index/resume/_search

{

          "query": {

                    "nested": {

                              "path": "language",

                              "query": {

                                        "bool": {

                                                  "must": [

                                                            {

                                                                      "term": {

                                                                                "language.class": {

                                                                                          "value": "eng"

                                                                                }

                                                                      }

                                                            },

                                                            {

                                                                      "term": {

                                                                                "language.rank": {

                                                                                          "value": 100

                                                                                }

                                                                      }

                                                            }

                                                  ]

                                        }

                              }

                    }

          }

}

二、ElasticSearch深分頁scroll和淺分頁from-size

簡介:

from-size,先查出全量然後從全量的from位置開始,取出size數量的文件。scroll,先通過_search/scroll命令查出卷標,然後通過卷標找出對應的文件集合。

https://www.cnblogs.com/xing901022/archive/2016/03/16/5284902.html(效率比較、寫法比較)

https://www.jianshu.com/p/14aa8b09c789(scroll原理詳解、引數意義)


上篇:【程式設計】在Kibana的幫助下進一步學習ElasticSearch