《Elasticsearch权威指南》案例集 之 基础入门


索引员工文档:

PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

检索文档:

GET /megacorp/employee/1

轻量搜索:

GET /megacorp/employee/_search

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

使用查询表达式:

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

更复杂的搜索:

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

全文搜索:

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

短语搜索:

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

高亮搜索:

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

分析:

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

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

索引文档:

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}
### 带id
PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}

### 自动生成id
POST /website/blog/
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}

取回一个文档:

GET /website/blog/123?pretty

GET /website/blog/123?_source=title,text

检查文档是否存在:

### 用 HEAD 方法来代替 GET
### 文档存在返回200 OK,不存在返回 404 Not Found
curl -i -XHEAD http://scroll 从旧的索引检索批量文档 , 然后用 bulk API 把文档推送到新的索引中。

从Elasticsearch v2.3.0开始, Reindex API 被引入。它能够对文档重建索引而不需要任何插件或外部工具。

GET /old_index/_search?scroll=1m
{
    "query": {
        "range": {
            "date": {
                "gte":  "2014-01-01",
                "lt":   "2014-02-01"
            }
        }
    },
    "sort": ["_doc"],
    "size":  1000
}

索引别名和零停机

### 设置别名 my_index 指向 my_index_v1 
PUT /my_index_v1/_alias/my_index

### 检测别名指向哪一个索引
GET /*/_alias/my_index

### 或哪些别名指向这个索引
GET /my_index_v1/_alias/*

### 一个别名可以指向多个索引,所以我们在添加别名到新索引的同时必须从旧的索引中删除它。这个操作需要原子化,这意味着我们需要使用 _aliases 操作
POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}

近实时搜索:

### 默认情况下每个分片会每秒自动刷新一次。这就是为什么我们说 Elasticsearch 是 近 实时搜索: 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见
### 手动刷新
POST /_refresh  
POST /blogs/_refresh

### 设置刷新频率
PUT /my_logs
{
  "settings": {
    "refresh_interval": "30s" 
  }
}

### 关闭自动刷新
PUT /my_logs/_settings
{ "refresh_interval": -1 } 
 
### 每秒刷新
PUT /my_logs/_settings
{ "refresh_interval": "1s" }

持久化变更:

### 一次完整的提交会将段刷到磁盘
### 片每30分钟被自动刷新(flush),或者在 translog 太大的时候也会刷新

### 手动刷新
POST /blogs/_flush 
 
POST /_flush?wait_for_ongoing


### 慎重设置,确保你了解后果
### 设置 durability 参数
PUT /my_index/_settings
{
    "index.translog.durability": "async",
    "index.translog.sync_interval": "5s"
}