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
}
}
]
}
