语法

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

PUT /megacorp/employee/2
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}

PUT /megacorp/employee/3
{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}

//  HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT 。
GET /megacorp/employee/1

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

// Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。
GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}

GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
          "must": {
              "match":{
                "about" : "rock climbing"
              }
            },
          "filter": {
          "range": {
            "age": {
              "gte": 20,
              "lte": 32
            }
          }
        }
        }
    }
}

GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
          "must": {
              "match_phrase":{
                "about" : "rock climbing"
              }
            },
          "filter": {
          "range": {
            "age": {
              "gte": 20,
              "lte": 32
            }
          }
        }
          
        }
    }
}

bool查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。
它接收以下参数:
	must : 文档必须匹配这些条件才能被包含进来。
	must_not : 文档必须不匹配这些条件才能被包含进来。
	should : 如果满足这些语句中的任意语句,将增加_score,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
	filter : 必须匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

// aggs、 suggestions、geolocation、percolation、fuzzy 、 partial matching


// 集群健康
GET /_cluster/health

//naming info
1. 索引——保存相关数据的地方,索引实际上是指向一个或者多个物理分片的逻辑命名空间。
2. 一个分片是一个底层的工作单元,它仅保存了全部数据中的一部分。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。
3. Elasticsearch 是利用分片将数据分发到集群内各处的。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。
4. 一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。
5. 节点是Elasticsearch的一个实例,集群就是有节点组成


// partial-updates
GET /megacorp/employee/_search

POST /megacorp/employee/3/_update
{
  "doc":{
    "age":36,
    "views":1
  }
}

GET /megacorp/employee/3

POST /megacorp/employee/3/_update?retry_on_conflict=5 
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 0
   }
}
GET /megacorp/employee/3


// mget
GET /megacorp/employee/_mget
{
  "ids":[1,2]
}

GET /megacorp/employee/_mget
{
  "ids":[1,2000]
}

//批量操作编辑 bulk
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }} 
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} } 



// get config(_mapping)
GET /megacorp/_mapping/employee


Elasticsearch使用一种称为倒排索引的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
分析包含下面的过程:
	首先,将一块文本分成适合于倒排索引的独立的词条,
	之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者recall
分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里:字符过滤器、分词器、Token过滤器
字符过滤器
	首先,字符串按顺序通过每个字符过滤器。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将&转化成`and`。
分词器
	其次,字符串被分词器分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
Token过滤器
	最后,词条按顺序通过每个token过滤器。这个过程可能会改变词条(例如,小写化Quick),删除词条(例如,像a`,`and`,`the等无用词),或者增加词条(例如,像jump和leap这种同义词)。

测试分析器
GET /_analyze
{
  "analyzer": "standard",
  "text": "Text to analyze"
}	

验证查询
GET /megacorp/_validate/query?explain
{
   "query": {
      "match" : {
         "about" : "really powerful"
      }
   }
}

返回结果默认按相关度 max_score 排序, 查询会计算结果
但是如果查询中有排序, 不会计算 max_score, 如果指定按相关度排序_score,  则会重新计算_score

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

GET /megacorp/_search
{
   "query": {
      "match" : {
         "about" : "rock"
      }
   },
  "sort": { "age": { "order": "asc" }}
}

GET /megacorp/_search
{
   "query": {
      "match" : {
         "about" : "rock"
      }
   },
  "sort": { 
      "age": { "order": "asc" },
      "_score": { "order": "asc" }
  }
}


执行分布式检索
	在 search 接口返回一个 page 结果之前,多分片中的结果必须组合成单个排序列表。为此,搜索被执行成一个两阶段过程,我们称之为 query then fetch 。
	
索引-创建索引
	PUT /my_index
		{
			"settings": { ... any settings ... },
			"mappings": {
				"type_one": { ... any mappings ... },
				"type_two": { ... any mappings ... },
				...
			}
		}
索引-删除索引
	DELETE /my_index
	DELETE /index_one,index_two
	DELETE /index_*
	DELETE /_all
	DELETE / * 
	
索引-索引设置
	number_of_shards : 每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
	number_of_replicas : 每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。
	
	可以创建只有 一个主分片,没有副本的小索引
		PUT /my_temp_index
			{
				"settings": {
					"number_of_shards" :   1,
					"number_of_replicas" : 0
				}
			}
	可以用 update-index-settings API 动态修改副本数:
		PUT /my_temp_index/_settings
			{
				"number_of_replicas": 1
			}
索引-配置分析器
		PUT /spanish_docs
			{
				"settings": {
					"analysis": {
						"analyzer": {
							"es_std": {
								"type":      "standard",
								"stopwords": "_spanish_"
							}
						}
					}
				}
			}
索引-动态映射
	dynamic 配置来控制动态映射 ,可接受的选项如下:
		true : 动态添加新的字段--缺省
		false : 忽略新的字段
		strict : 如果遇到新字段抛出异常
	配置参数 dynamic 可以用在根 object 或任何 object 类型的字段上
		PUT /my_index
		{
			"mappings": {
				"my_type": {
					"dynamic":      "strict", 
					"properties": {
						"title":  { "type": "string"},
						"stash":  {
							"type":     "object",
							"dynamic":  true 
						}
					}
				}
			}
		}
		my_type :如果遇到新字段,对象 my_type 就会抛出异常。
		stash :遇到新字段就会动态创建新字段。
	日期检测
		PUT /my_index
			{
				"mappings": {
					"my_type": {
						"date_detection": false
					}
				}
			}
		使用这个映射,字符串将始终作为 string 类型。如果你需要一个 date 字段,你必须手动添加。
索引-重新索引
	批量重新索引
		同时并行运行多个重建索引任务,但是你显然不希望结果有重叠。正确的做法是按日期或者时间 这样的字段作为过滤条件把大的重建索引分成小的任务
		GET /old_index/_search?scroll=1m
			{
				"query": {
					"range": {
						"date": {
							"gte":  "2014-01-01",
							"lt":   "2014-02-01"
						}
					}
				},
				"sort": ["_doc"],
				"size":  1000
			}
索引-索引别名和零停机
	有两种方式管理别名: _alias 用于单个操作, _aliases 用于执行多个原子级操作。
	创建索引 my_index_v1 , 设置别名 my_index 指向 my_index_v1 
		PUT /my_index_v1 
		PUT /my_index_v1/_alias/my_index 
	检测这个别名指向哪一个索引
		GET /*/_alias/my_index
	哪些别名指向这个索引
		GET /my_index_v1/_alias/*
		
		同时并行运行多个重建索引任务,但是你显然不希望结果有重叠。正确的做法是按日期或者时间 这样的字段作为过滤条件把大的重建索引分成小的任务
		GET /old_index/_search?scroll=1m
			{
				"query": {
					"range": {
						"date": {
							"gte":  "2014-01-01",
							"lt":   "2014-02-01"
						}
					}
				},
				"sort": ["_doc"],
				"size":  1000
			}