Elasticsearch权威指南(中文版)

Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。它用于全文搜索、结构化搜索、分析以及将这三者混合使用: 1.维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type)和搜索纠错(did-you-mean)等搜索建议功能。 2.美国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章回应。 3.StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。 4.Github使用Elasticsearch检索1300亿行的代码
展开查看详情

1.

2.Table of Contents 1. Introduction 2. 门 i. ii. iii. API iv. v. vi. vii. viii. 结 ix. x. 结语 3. i. ii. iii. iv. 转 v. 扩 vi. 扩 vii. 应对 4. i. ii. iii. 获 iv. v. vi. 创 vii. 删 viii. ix. x. Mget xi. xii. 结语 5. 删 查 i. ii. iii. 删 iv. 检 v. vi. 请 vii. 6. i. ii. 类 iii. 页 iv. 查询 7. i. 类 ii. 值对 iii. iv. v.

3. vi. 类 8. 结构 查询 i. 请 查询 ii. 结构 查询 iii. 查询 过滤 iv. 查询 v. 过滤查询 vi. 验证查询 vii. 结语 9. i. ii. iii. iv. 10. i. 查询阶 ii. 阶 iii. 选项 iv. 扫 滚 11. i. 创 删 ii. 设 iii. iv. 义 v. vi. 对 vii. source viii. all ix. ID x. 动态 xi. 义动态 xii. 认 xiii. xiv. 别 12. i. ii. 动态 iii. 实时 iv. 变 v. 13. 结构 i. 查询 值 ii. 组 过滤 iii. 查询 值 iv. v. 围 vi. 处 Null 值 vii. 缓 viii. 过滤顺 14. i. 查询 ii. 词查询 iii. 组 查询 iv. 尔 v. vi.

4.vii. 联

5.Elasticsearch 权 阅读 Elasticsearch权 书 Elasticsearch the definitive guide clinton gormley zachary tong 译 Looly 译 @iridiumcao @cvvnx1 @conan007ai @sailxjx @wxlfight @xieyunzi @xdream86 @conan007ai @williamzhao @dingusxp 谢 译 伙 们~~ 邮 loolly@gmail.com @ 项 https://github.com/looly/elasticsearch-definitive-guide-cn http://git.oschina.net/loolly/elasticsearch-definitive-guide-cn 阅读

6.http://es.xiaoleilu.com/ 说 Elasticsearch 简单 译 时 统 习 语 较 译 欢 issue: github git@osc 译 键 约 index -> type -> 类 token -> filter -> 过滤 analyser -> Pull Request 对Pull Request @numbbbbb The Swift Programming Language 协 谢 1. fork 项 2. fork过 项 项 clone 3. 运 git remote add looly git@github.com:looly/elasticsearch-definitive-guide-cn.git 库 为远 库 4. 运 git pull looly master 5. 译 6. commit push 库 git push origin master 7. 陆Github 页 pull request 钮 击 说 1~3 执 译 须执 4 库 这样 执 5~7 1. 还 译 gitbook 经 译 节 陆续 gitbook 2. 为 译 译 贝

7. 门 Elasticsearch 实时 让 处 为 结构 这 维 Elasticsearch 键 输 实时 (search-as-you-type) 纠错(did-you- mean) 议 卫报 Elasticsearch结 户 络 给 们 编辑 实时 馈 时 众对 发 应 StackOverflow结 查询 more-like-this 问题 Github Elasticsearch检 1300亿 码 Elasticsearch 仅 业 还让 DataDog Klout这样 创业 变 扩 Elasticsearch 笔记 运 计 务 处 PB级别 Elasticsearch 项 术 创 统 库这 经 这 术 实时 应 对 户 门槛 长 这 书 说 经 够 对这 现 库 识 显 们 够 过时间 过滤 们 够进 处 义词 给 吗 们 结 吗 们 进 线 对 实时处 吗 这 Elasticsearch Elasticsearch 浏览 让 烂 库 为 库 实 难查询 Elasticsearch 认识

8.为 懂 Elasticsearch Apache Lucene(TM) 论 还 专 领 Lucene 认为 为 进 库 Lucene 库 须 Java 为 发语 应 Lucene 杂 检 识 Elasticsearch Java 发 Lucene 为 实现 过简单 RESTful API 隐 Lucene 杂 让 变 简单 过 Elasticsearch 仅仅 Lucene 们还 这样 实时 储 实时 扩 务 处 PB级结构 结构 这 务 应 过简单 RESTful API 语 户 Elasticsearch 许 值 对 隐 杂 论 习 产环 Elasticsearch Apache 2 license 许 费 载 对Elasticsearch 问题领 Elasticsearch 级 这 历 Shay Banon 刚结 业 发 伦 习 师 过 为 给 构 谱 构 Lucene Lucene 较 难 Shay Lucene 码 Java 员 应 发 项 “Compass” Shay 这 处 环 实时 Compass库 为 务 Elasticsearch 现 2010 2 Elasticsearch 经 为Github 欢 项 码贡 过300 营Elasticsearch 们 边 业 边 发 过Elasticsearch 远 对 Shay 她 谱 ……

9. Elasticsearch Elasticsearch 运 让 们 Elasticsearch Java www.java.com elasticsearch.org/download 载 Elasticsearch curl -L -O http://download.elasticsearch.org/PATH/TO/VERSION.zip <1> unzip elasticsearch-$VERSION.zip cd elasticsearch-$VERSION 1. elasticsearch.org/download 获 URL 产环 时 还 Debian RPM 这 downloads page Puppet module Chef cookbook Marvel Marvel Elasticsearch 监 发环 费 Sense 户 过浏览 Elasticsearch进 Elasticsearch线 码 带 View in Sense 链 击进 Sense 应 实 Marvel 须 过 Elasticsearch 运 码 书 动 Marvel Elasticsearch 录 运 载 ./bin/plugin -i elasticsearch/marvel/latest 监 过 闭Marvel echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml 运 Elasticsearch Elasticsearch 经 备 绪 执 启动 ./bin/elasticsearch 护进 运 -d 另 终 进 测试 curl 'http://localhost:9200/?pretty'

10. { "status": 200, "name": "Shrunken Bones", "version": { "number": "1.4.0", "lucene_version": "4.10" }, "tagline": "You Know, for Search" } 这说 ELasticsearch 经启动 运 们 实验 节 节 (node) 运 Elasticsearch实 (cluster) 组 cluster.name 节 们协 转 扩 节 组 cluster.name 认值 这样 启动 节 络 另 过 config/ 录 elasticsearch.yml 启ELasticsearch 这 Elasticsearch 运 Ctrl-C 键终 调 shutdown API 闭 curl -XPOST 'http://localhost:9200/_shutdown' 查 Marvel Sense Marvel 为 监 浏览 过 访问 http://localhost:9200/_plugin/marvel/ Marvel 过 击 dashboards 单 访问Sense 发 访问 http://localhost:9200/_plugin/marvel/sense/

11. Elasticsearch Elasticsearch Java Java API Elasticsearch为Java 户 两 户 节 户 (node client) 节 户 节 (none data node) 换 储 够 转发请 对应 节 传输 户 (Transport client) 这 轻 传输 户 够发 请 远 简单转发请 给 节 两 Java 户 过9300 Elasticsearch传输协议(Elasticsearch Transport Protocol) 节 间 过9300 进 节 组 TIP Java 户 Elasticsearch 须 节 则 们 识别 Java API 请查 节 Java API HTTP协议 JSON为 RESTful API 语 RESTful API 过9200 Elasticsearch进 欢 WEB 户 实 见 过 curl Elasticsearch NOTE Elasticsearch 语 户 ——Groovy Javascript .NET PHP Perl Python Ruby ——还 户 这 Elasticsearch发 请 组 HTTP请 样 curl -X<VERB> '<PROTOCOL>://<HOST>/<PATH>?<QUERY_STRING>' -d '<BODY>' VERB HTTP GET , POST , PUT , HEAD , DELETE PROTOCOL http https协议 Elasticsearch https 时 HOST Elasticsearch 节 节 localhost PORT Elasticsearch HTTP 务 认为9200 QUERY_STRING 选 查询请 ?pretty 请 观 读 JSON BODY JSON 请 请 话 举 说 为 计 们 这样 curl -XGET 'http://localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }

12. ' Elasticsearch 类 200 OK HTTP 态码 JSON 响应 HEAD 请 请 JSON 响应 { "count" : 0, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 } } 们 HTTP头 为 们 让 curl 显 们 显 curl -i : curl -i -XGET 'localhost:9200/' 对 书 们 简 curl 请 还 curl 请 curl -XGET 'localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }' 们 简 这样 GET /_count { "query": { "match_all": {} } } 实 Sense

13.应 对 简单 键值 时 拥 杂 结构 另 对 组 总 这 对 储 库 这 组 库 现 对 对 应 查询 时 们 Elasticsearch (document oriented) 这 储 对 (document) 仅仅 储 还 (index) Elasticsearch 对 进 过滤 这 这 Elasticsearch 够执 杂 JSON ELasticsearch Javascript对 (JavaScript Object Notation) JSON 为 JSON现 经 语 经 为NoSQL领 标 简洁 简单 阅读 JSON 户对 { "email": "john@smith.com", "first_name": "John", "last_name": "Smith", "info": { "bio": "Eco-warrior and defender of the weak", "age": 25, "interests": [ "dolphins", "whales" ] }, "join_date": "2014/05/01" } user 对 杂 结构 对 义 经 现 JSON Elasticsearch 对 转 为 JSON 结构 简单 NOTE 语 应 块 结构转换为JSON 语 处 细节 请查 “ serialization ” or “ marshalling ”两 处 JSON 块 Elasticsearch 户 动为 JSON

14. 们现 进 简单 绍 (indexing) (search) (aggregations) 过这 们 让 对Elasticsearch 觉 们 陆续 绍 术语 马 们 书 节 讨这 风 Elasticsearch 让 们 员 录 设 们刚 Megacorp 这时 资 门 让 们创 员 录 这 录 进 怀 实时协 够 值 标签 纯 检 员 结构 查 30岁 员 简单 杂 语(phrase) 结 键 够 图 这 员 们 储员 员 Elasticsearch 储 为 (indexing) 过 们 应该 储 哪 Elasticsearch 归 类 (type), 这 类 (index) 们 简单 对 图 类 传统 库 Relational DB -> Databases -> Tables -> Rows -> Columns Elasticsearch -> Indices -> Types -> Documents -> Fields Elasticsearch (indices) 库 类 (types) 类 (documents) (Fields) 义 经 (index)这 词 Elasticsearch 义 : 词 (index) 传统 库 库 储 index indices indexes 动词 储 词 检 查询 这 SQL INSERT 键 别 经 传统 库为 B-Tree 检 Elasticsearch Lucene (inverted index) 结构 达 认 拥 这样 们 们 节 详细 讨论 为 创 员 录 们 进

15. 为 员 (document) 应员 类 为 employee employee 类 归 megacorp megacorp 储 Elasticsearch 实际 这 许 骤 们 过 执 PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } 们 path: /megacorp/employee/1 说 megacorp employee 类 1 这 员 ID 请 实 JSON 这 员 “John Smith” 25岁 欢 简单 额 创 义 类 们 够 Elasticsearch 经 设 让 们 录 员 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" ] }

16.检 现 Elasticsearch 经 储 们 业务 够检 单 员 这对 Elasticsearch 说 简单 们 执 HTTP GET请 “ ”—— 类 ID 这 们 JSON GET /megacorp/employee/1 响应 John Smith JSON _source { "_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" ] } } 们 过HTTP GET 检 样 们 DELETE 删 HEAD 检查 们 PUT 简单 GET 请 简单—— 轻 获 让 们 进 尝试 东 简单 们尝试 简单 员 请 GET /megacorp/employee/_search 们 megacorp employee 类 们 结 键 _search ID 响应 hits 组 们 认 10 结 { "took": 6, "timed_out": false, "_shards": { ... }, "hits": { "total": 3, "max_score": 1, "hits": [ { "_index": "megacorp", "_type": "employee", "_id": "3", "_score": 1, "_source": { "first_name": "Douglas", "last_name": "Fir", "age": 35, "about": "I like to build cabinets", "interests": [ "forestry" ] } },

17. { "_index": "megacorp", "_type": "employee", "_id": "1", "_score": 1, "_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": 1, "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } } 响应 仅 诉 们哪 这 — 们 给 户 结 时 让 们 “Smith” 员 这 们 轻 级 这 查询 (query string) 为 们 传递URL 样 传递查询语 GET /megacorp/employee/_search?q=last_name:Smith 们 请 _search 键 查询语 传递给 q= 这样 为Smith 结 { ... "hits": { "total": 2, "max_score": 0.30685282, "hits": [ { ... "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { ... "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } }

18. DSL语 查询 查询 过 (ad hoc) 阅简单 节 Elasticsearch 查询语 DSL查询(Query DSL), 许 构 杂 查询 DSL(Domain Specific Language 领 语 ) JSON请 现 们 这样 “Smith” 查询: GET /megacorp/employee/_search { "query" : { "match" : { "last_name" : "Smith" } } } 这 查询 结 东 变 们 查询 (query string) 为 请 这 请 JSON match 语 查询类 们 杂 们让 变 杂 们 为“Smith” 员 们 龄 30岁 员 们 语 过滤 (filter), 们 执 结构 GET /megacorp/employee/_search { "query" : { "filtered" : { "filter" : { "range" : { "age" : { "gt" : 30 } <1> } }, "query" : { "match" : { "last_name" : "smith" <2> } } } } } <1> 这 查询 间过滤 (range filter), 查 龄 30岁 —— gt 为"greater than" 缩 <2> 这 查询 match 语 (query) 现 语 们 详细 讨论 们 过滤 (filter) 执 间 match 语 现 们 结 显 32岁 “Jane Smith” 员 { ... "hits": { "total": 1, "max_score": 0.30685282, "hits": [ { ... "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ]

19. } } 为 简单 过 龄筛选 让 们尝试 级 —— 传统 库 难实现 们 欢“rock climbing” 员 GET /megacorp/employee/_search { "query" : { "match" : { "about" : "rock climbing" } } } 们 match 查询 about "rock climbing" 们 两 { ... "hits": { "total": 2, "max_score": 0.16273327, "hits": [ { ... "_score": 0.16273327, <1> "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { ... "_score": 0.016878016, <2> "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } } <1><2> 结 评 认 Elasticsearch 结 评 对结 进 谓 结 评 查询 显 John Smith about “rock climbing” 为 Jane Smith 现 结 “rock” 她 abuot 为 “rock” “climbing” 她 _score John 这 释 Elasticsearch 进 结 (relevance) Elasticsearch 这 传统 库 为传统 库对记录 查询

20. 语 们 单 词 这 时 单词 语(phrases) 们 查询 时 "rock" "climbing" 邻 员 记录 这 们 match 查询变 为 match_phrase 查询 : GET /megacorp/employee/_search { "query" : { "match_phrase" : { "about" : "rock climbing" } } } 问 该查询 John Smith { ... "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) 键 这样 户 为 这 查询 Elasticsearch 让 们 语 highlight GET /megacorp/employee/_search { "query" : { "match_phrase" : { "about" : "rock climbing" } }, "highlight": { "fields" : { "about" : {} } } } 们运 这 语 时 结 结 highlight 这 about <em></em> 标识 单词

21.{ ... "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>" <1> ] } } ] } } <1> 节阅读

22. 们还 许 职员 录 进 Elasticsearch (aggregations) 许 杂 统计 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" } } } } all_interests 经变 查询语 ...

23. "all_interests": { "buckets": [ { "key": "music", "doc_count": 2 }, { "key": "sports", "doc_count": 1 } ] } 许 级汇总 让 们统计 兴 职员 龄 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 } } ] } 该 结 结 们 兴 该兴 员 现 兴 额 拥 avg_age 显 该兴 员 龄 还 语 觉 过这 杂 处 类

24. 结 这 简 够 Elasticsearch 这 为 简 还 —— 这 构 级 语 让 觉 调 问 书 这 问题 细节 让 Elasticsearch 过

25. 节 们 Elasticsearch 扩 务 处 PB级 们 给 Elasticsearch Elasticsearch为 设计隐 杂 Elasticsearch 统 发现 运 笔记 运 拥 100 节 样 Elasticsearch 隐 统 杂 这 层 动 (shards) 们 节 节 对 负载 丢 节 请 应 节 论 节 还 节 缝 扩 阅读 书时 Elasticsearch 补 节 这 节 给 扩 转 处 储 执 这 节 读 —— 懂这 Elasticsearch 这 够 Elasticsearch 读 们 时 头 阅

26.现 对Elasticsearch Elasticsearch 习 轻 习 Elasticsearch 检 Elasticsearch 产 详细 诉Elasticsearch 应 输 书 级 专 节 阐 专 级别 刚 这 暂时 Elasticsearch 认 户 预 时 时 顾这 节

27. 补 节 这 Elasticsearch 环 补 节 这 节 们 释 术语 (cluster) 节 (node) (shard) Elasticsearch 扩 处 这 读 —— Elasticsearch 时 长时间 远 转 —— Elasticsearch 过这 查阅 Elasticsearch 构 扩 统 扩 购买 务 (纵 扩 (vertical scale or scaling up)) 购买 务 扩 (horizontal scale or scaling out) Elasticsearch虽 获 纵 扩 扩 应该 过 节 摊负载 对 库 扩 动 这 设备 对 说 Elasticsearch 节 扩 这 这 这 们 创 (cluster) 节 (node) (shards) 进 扩 证 时

28. 们启动 单 节 还 这 图1 图1 节 节 (node) Elasticsearch实 (cluster) 节 组 们 cluster.name 们协 负载 节 删 节 时 节 选举为 节 (master), 临时 级别 变 删 节 节 级别 变 这 长 时 该 节 为 颈 节 为 节 们 节 节 为 户 们 够 节 节 节 哪 节 们 转发请 应 节 们访问 节 负责 节 给 户 这 Elasticsearch处

29. Elasticsearch 监 统计 (cluster health) 态 green yellow red GET /_cluster/health 运 查询 这 { "cluster_name": "elasticsearch", "status": "green", <1> "timed_out": false, "number_of_nodes": 1, "number_of_data_nodes": 1, "active_primary_shards": 0, "active_shards": 0, "relocating_shards": 0, "initializing_shards": 0, "unassigned_shards": 0 } <1> status 们 兴 status 综 标 务 颜 义 颜 义 green yellow red 节 们 说 (primary shard) (replica shard) 说 这 颜 态 实际 环 义