elasticsearch增刪改查操作


1. 插入數據

關於下面的代碼如何使用,可以借助於kibana的console,瀏覽器打開地址:

    http://xxx.xxx.xxx.xxx:5601/app/kibana#/dev_tools/console?_g=()

在console中輸入代碼,然后運行即可,也可以自己改成curl形式在命令行輸入

插入數據可以指定id或者不指定id

1> 使用自定義的id

使用put方式,並自己提供id

類似於下面的格式

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

請求

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}

響應

{
   "_index":    "website",
   "_type":     "blog",
   "_id":       "123",
   "_version":  1,
   "created":   true
}

在 Elasticsearch 中每個文檔都有一個版本號。當每次對文檔進行修改時(包括刪除), _version 的值會遞增。

2> 自動生成id

使用post方式

POST /website/blog/
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}
{
   "_index":    "website",
   "_type":     "blog",
   "_id":       "AVFgSgVHUP18jI2wRx0w",
   "_version":  1,
   "created":   true
}

自動生成的 ID 是 URL-safe、 基於 Base64 編碼且長度為20個字符的 GUID 字符串。 這些 GUID 字符串由可修改的 FlakeID 模式生成,這種模式允許多個節點並行生成唯一 ID ,且互相之間的沖突概率幾乎為零。

2. 更改數據

控制台輸入

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}

在響應體中,我們能看到 Elasticsearch 已經增加了 _version 字段值,created 標志設置成 false ,是因為相同的索引、類型和 ID 的文檔已經存在。

{
  "_index": "website",
  "_type": "blog",
  "_id": "123",
  "_version": 2,
  "created": false
}

3. 刪除數據

DELETE /website/blog/123

如果找到該文檔,Elasticsearch 將要返回一個 200 ok 的 HTTP 響應碼,和一個類似以下結構的響應體。注意,字段 _version 值已經增加:

{
  "found" :    true,
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 3
}

如果文檔沒有 找到,我們將得到 404 Not Found 的響應碼和類似這樣的響應體:

{
  "found" :    false,
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 4
}

4. 檢索文檔

這里只是先簡單的介紹下如何檢索文檔,后面會詳細介紹這部分內容

1> 檢索id為1的員工

在bibana的console中輸入運行

GET /megacorp/employee/1

返回結果包含了文檔的一些元數據,以及 _source 屬性,內容是 John Smith 雇員的原始 JSON 文檔:

{
  "_index": "megacorp",
  "_type": "employee",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "first_name": "John",
    "last_name": "Smith",
    "age": 25,
    "about": "I love to go rock climbing",
    "interests": [
      "sports",
      "music"
    ]
  }
}

2> 搜索所有雇員

GET /megacorp/employee/_search

返回結果包括了所有三個文檔,放在數組 hits 中。一個搜索默認返回十條結果

elasticsearch 提供了兩種查詢模式

1> Query-string:通過url參數來搜索,被稱為查詢字符串搜索。

GET /megacorp/employee/_search?q=last_name:Smith

2> Query-DSL:使用查詢表達式搜索,被稱為DSL查詢,它支持構建更加復雜和健壯的查詢,一般來說我們重點學習這種方法。

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

3> 更復雜的搜索

GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}

注意這里搜索last_name是smith的人,同時年齡大於30。注意下語法bool里面有must,filter類型,當然以后還會學到更多類型,這里先有個意識。

4> 全文搜索

比如想要搜索下所有喜歡攀岩(rock climbing)的雇員

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.53484553,
    "hits": [
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "1",
        "_score": 0.53484553,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "2",
        "_score": 0.26742277,
        "_source": {
          "first_name": "Jane",
          "last_name": "Smith",
          "age": 32,
          "about": "I like to collect rock albums",
          "interests": [
            "music"
          ]
        }
      }
    ]
  }
}

注意這里稍有不同,about字段中包含兩個單詞,搜索的結果並不是完全匹配,是根據單詞去做了相關性匹配。

Elasticsearch 默認按照相關性得分排序,即每個文檔跟查詢的匹配程度。

Elasticsearch中的 相關性 概念非常重要,也是完全區別於傳統關系型數據庫的一個概念,數據庫中的一條記錄要么匹配要么不匹配。

5> 短語搜索

上面如果一個短語包含多個單詞,那豈不是不能精確查詢了,當然不是,可以使用短語搜索。

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

這樣結果就是精確匹配了,僅匹配同時包含 “rock” 和 “climbing” ,並且 二者以短語 “rock climbing” 的形式緊挨着的結果

6> 高亮搜索

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

結果中多了一個highlight部分

{
   ...
   "hits": {
      "total":      1,
      "max_score":  0.23013961,
      "hits": [
         {
            ...
            "_score":         0.23013961,
            "_source": {
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            },
            "highlight": {
               "about": [
                  "I love to go <em>rock</em> <em>climbing</em>" 
               ]
            }
         }
      ]
   }
}

7> 聚合

聚合類似於SQL中的GROUP_BY,但功能更強大

GET /megacorp/employee/_search
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}

結果

{
   ...
   "hits": { ... },
   "aggregations": {
      "all_interests": {
         "buckets": [
            {
               "key":       "music",
               "doc_count": 2
            },
            {
               "key":       "forestry",
               "doc_count": 1
            },
            {
               "key":       "sports",
               "doc_count": 1
            }
         ]
      }
   }
}

以上是對所有的雇員進行統計,我們也可以其中的一部分雇員進行組合查詢統計,比如我們想知道叫smith的雇員最受歡迎的興趣愛好。

GET /megacorp/employee/_search
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}

聚合還支持分級匯總,查詢特定興趣愛好的 員工的平均年齡

GET /megacorp/employee/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}

結果

  ...
  "all_interests": {
     "buckets": [
        {
           "key": "music",
           "doc_count": 2,
           "avg_age": {
              "value": 28.5
           }
        },
        {
           "key": "forestry",
           "doc_count": 1,
           "avg_age": {
              "value": 35
           }
        },
        {
           "key": "sports",
           "doc_count": 1,
           "avg_age": {
              "value": 25
           }
        }
     ]
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM