-
Notifications
You must be signed in to change notification settings - Fork 5
/
elasticsearch.txt
5257 lines (4164 loc) · 210 KB
/
elasticsearch.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
第1章 Elasticsearch开发搜索引擎应用1
1.1 搜索引擎开发需求1
1.2 准备开发环境1
1.2.1 Windows命令行cmd1
1.2.2 在Windows下使用Java3
1.2.3 Linux终端5
1.2.4 在Linux下使用Java9
1.2.5 Eclipse集成开发环境10
1.3 了解Elasticsearch10
1.3.1 JSON数据格式11
1.3.2 Elasticsearch基本概念12
1.3.3 HTTP协议13
1.4 Elasticsearch安装和配置16
1.4.1 安装Elasticsearch16
1.4.2 运行Elasticsearch作为服务进程19
1.5 实现一个简单的网站搜索21
1.5.1 定义索引结构23
1.5.2 导入数据26
1.5.3 查询API27
1.5.4 实现搜索界面29
1.6 本章小结35
第2章 开发中文搜索引擎36
2.1 中文分词原理36
2.1.1 最长匹配方法36
2.1.2 自己写分析器42
2.1.3 概率语言模型的分词方法44
2.1.4 中文分词插件原理52
2.1.5 开发中文分词插件54
2.1.6 支持Elasticsearch的插件57
2.1.7 中文分析器提供者59
2.1.8 字词混合索引61
2.2 提高分词准确度63
2.3 本章小结65
第3章 Mapping详解66
3.1 索引模式66
3.1.1 创建模式66
3.1.2 修改模式68
3.2 Mapping数据类型69
3.3 Mapping参数70
3.4 动态Mapping71
3.4.1 使用动态Mapping72
3.4.2 实现原理72
3.5 本章小结74
第4章 深入源码分析75
4.1 Lucene源码分析75
4.1.1 使用Lucene75
4.1.2 Ivy管理依赖项77
4.1.3 源码结构介绍77
4.1.4 并发控制82
4.2 启动搜索服务88
4.3 Guice框架89
4.4 日期和时间库——Joda-Time91
4.5 Transport模块91
4.6 线程池92
4.7 模块93
4.8 Netty通信框架93
4.9 缓存94
4.10 分布式95
4.11 Zen发现机制95
4.12 联合搜索97
4.13 JVM字节码98
4.13.1 编译代码99
4.13.2 同步相关指令99
4.14 本章小结100
第5章 提高搜索相关性102
5.1 向量空间检索模型102
5.2 BM25检索模型105
5.2.1 使用BM25检索模型108
5.2.2 参数调优108
5.3 学习评分109
5.3.1 基本原理109
5.3.2 准备数据110
5.3.3 Elasticsearch学习排名112
5.4 查询意图识别112
5.5 图像特征提升检索体验113
5.6 本章小结116
第6章 搜索界面开发118
6.1 使用Searchkit实现搜索界面118
6.2 Spring Boot入门122
6.2.1 可执行的WAR125
6.2.2 spring-boot-devtools模块实现热部署136
6.3 Java模板引擎Pebble介绍136
6.4 通过Spring-data-elasticsearch 项目访问Elasticsearch141
6.5 REST基本概念149
6.6 使用Vue.js开发搜索界面154
6.7 使用Vue.js Paginator插件实现翻页157
6.8 实现搜索接口161
6.8.1 编码识别161
6.8.2 布尔搜索163
6.8.3 搜索结果重定向164
6.8.4 搜索结果排序165
6.8.5 实现相似文档搜索166
6.9 Suggester搜索词提示167
6.9.1 拼音提示169
6.9.2 部署总结169
6.9.3 相关搜索170
6.9.4 再次查找172
6.9.5 搜索日志172
6.10 Word2vec挖掘相关搜索词174
6.11 部署网站179
6.11.1 部署到Web服务器179
6.11.2 防止攻击181
6.12 使用Rust开发搜索界面184
6.13 本章小结184
第7章 Elastic栈系统监控186
7.1 管理Elasticsearch集群186
7.1.1 写入权限控制187
7.1.2 使用X-Pack188
7.1.3 快照189
7.2 Logstash数据处理工具190
7.2.1 使用Logstash190
7.2.2 插件192
7.2.3 数据库输入插件192
7.2.4 开发插件193
7.3 Filebeat文件收集器193
7.4 消息过期194
7.5 Kibana可视化平台195
7.6 Flume日志收集系统196
7.7 Kafka分布式流平台197
7.8 Graylog日志管理平台198
7.9 本章小结202
第8章 案例分析204
8.1 双语句对搜索204
8.1.1 爬虫抓取双语句对204
8.1.2 英文分词205
8.1.3 句子切分205
8.1.4 标注词性207
8.1.5 词对齐209
8.1.6 索引数据213
8.2 内容管理系统站内检索214
8.2.1 MySQL数据库214
8.2.2 RESTful API管理索引215
8.2.3 自动客服机器人217
8.3 搜索文档225
8.3.1 爬虫抓取信息225
8.3.2 在Linux下使用.NET233
8.3.3 NEST客户端235
8.4 本章小结239
参考文献240
1.1 用Elasticsearch解决搜索问题 3
1.1.1 提供快速查询 3
1.1.2 确保结果的相关性 4
1.1.3 超越精确匹配 5
1.2 探索典型的Elasticsearch使用案例 6
1.2.1 将Elasticsearch作为主要的后端系统 7
1.2.2 将Elasticsearch添加到现有的系统 7
1.2.3 将Elasticsearch和现有工具一同使用 8
1.2.4 Elasticsearch的主要特性 10
1.2.5 扩展Lucene的功能 10
1.2.6 在Elasticsearch中组织数据 12
1.2.7 安装Java语言 12
1.2.8 下载并启动Elasticsearch 13
1.2.9 验证是否工作 14
1.3 小结 16
第2章 深入功能 17
2.1 理解逻辑设计:文档、类型和索引 18
2.1.1 文档 19
2.1.2 类型 20
2.1.3 索引 21
2.2 理解物理设计:节点和分片 21
2.2.1 创建拥有一个或多个节点的集群 22
2.2.2 理解主分片和副本分片 23
2.2.3 在集群中分发分片 25
2.2.4 分布式索引和搜索 26
2.3 索引新数据 27
2.3.1 通过cURL索引一篇文档 28
2.3.2 创建索引和映射类型 30
2.3.3 通过代码样例索引文档 31
2.4 搜索并获取数据 32
2.4.1 在哪里搜索 33
2.4.2 回复的内容 33
2.4.3 如何搜索 36
2.4.4 通过ID获取文档 39
2.5 配置Elasticsearch 40
2.5.1 在elasticsearch.yml中指定集群的名称 40
2.5.2 通过logging.yml指定详细日志记录 41
2.5.3 调整JVM设置 41
2.6 在集群中加入节点 42
2.6.1 启动第二个节点 43
2.6.2 增加额外的节点 44
2.7 小结 45
第3章 索引、更新和删除数据 47
3.1 使用映射来定义各种文档 48
3.1.1 检索和定义映射 49
3.1.2 扩展现有的映射 50
3.2 用于定义文档字段的核心类型 51
3.2.1 字符串类型 52
3.2.2 数值类型 54
3.2.3 日期类型 55
3.2.4 布尔类型 56
3.3 数组和多字段 56
3.3.1 数组 56
3.3.2 多字段 57
3.4 使用预定义字段 58
3.4.1 控制如何存储和搜索文档 59
3.4.2 识别文档 61
3.5 更新现有文档 63
3.5.1 使用更新API 64
3.5.2 通过版本来实现并发控制 66
3.6 删除数据 69
3.6.1 删除文档 70
3.6.2 删除索引 71
3.6.3 关闭索引 72
3.6.4 重新索引样本文档 73
3.7 小结 73
第4章 搜索数据 74
4.1 搜索请求的结构 75
4.1.1 确定搜索范围 75
4.1.2 搜索请求的基本模块 76
4.1.3 基于请求主体的搜索请求 78
4.1.4 理解回复的结构 81
4.2 介绍查询和过滤器DSL 82
4.2.1 match查询和term过滤器 82
4.2.2 常用的基础查询和过滤器 85
4.2.3 match查询和term过滤器 91
4.2.4 phrase_prefix查询 92
4.3 组合查询或复合查询 93
4.3.1 bool查询 93
4.3.2 bool过滤器 96
4.4 超越match和过滤器查询 98
4.4.1 range查询和过滤器 98
4.4.2 prefix查询和过滤器 99
4.4.3 wildcard查询 100
4.5 使用过滤器查询字段的存在性 102
4.5.1 exists过滤器 102
4.5.2 missing过滤器 102
4.5.3 将任何查询转变为过滤器 103
4.6 为任务选择最好的查询 104
4.7 小结 105
第5章 分析数据 106
5.1 什么是分析 106
5.1.1 字符过滤 107
5.1.2 切分为分词 108
5.1.3 分词过滤器 108
5.1.4 分词索引 108
5.2 为文档使用分析器 109
5.2.1 在索引创建时增加分析器 109
5.2.2 在Elasticsearch的配置中添加分析器 111
5.2.3 在映射中指定某个字段的分析器 112
5.3 使用分析API来分析文本 113
5.3.1 选择一个分析器 114
5.3.2 通过组合即兴地创建分析器 115
5.3.3 基于某个字段映射的分析 115
5.3.4 使用词条向量API来学习索引词条 116
5.4 分析器、分词器和分词过滤器 117
5.4.1 内置的分析器 117
5.4.2 分词器 119
5.4.3 分词过滤器 122
5.5 N元语法、侧边N元语法和滑动窗口 128
5.5.1 一元语法过滤器 128
5.5.2 二元语法过滤器 129
5.5.3 三元语法过滤器 129
5.5.4 设置min_gram和max_gram 129
5.5.5 侧边N元语法过滤器 129
5.5.6 N元语法的设置 130
5.5.7 滑动窗口分词过滤器 131
5.6 提取词干 132
5.6.1 算法提取词干 133
5.6.2 使用字典提取词干 133
5.6.3 重写分词过滤器的词干提取 134
5.7 小结 134
第6章 使用相关性进行搜索 136
6.1 Elasticsearch的打分机制 137
6.1.1 文档打分是如何运作的 137
6.1.2 词频 137
6.1.3 逆文档频率 138
6.1.4 Lucene评分公式 138
6.2 其他打分方法 139
6.3 boosting 141
6.3.1 索引期间的boosting 142
6.3.2 查询期间的boosting 142
6.3.3 跨越多个字段的查询 143
6.4 使用“解释”来理解文档是如何被评分的 144
6.5 使用查询再打分来减小评分操作的性能影响 147
6.6 使用function_score来定制得分 148
6.6.1 weight函数 149
6.6.2 合并得分 150
6.6.3 field_value_factor函数 151
6.6.4 脚本 152
6.6.5 随机 152
6.6.6 衰减函数 153
6.6.7 配置选项 155
6.7 尝试一起使用它们吧 156
6.8 使用脚本来排序 157
6.9 字段数据 158
6.9.1 字段数据缓存 158
6.9.2 字段数据用在哪里 159
6.9.3 管理字段数据 160
6.10 小结 163
第7章 使用聚集来探索数据 164
7.1 理解聚集的具体结构 166
7.1.1 理解聚集请求的结构 166
7.1.2 运行在查询结果上的聚集 168
7.1.3 过滤器和聚集 169
7.2 度量聚集 170
7.2.1 统计数据 171
7.2.2 高级统计 172
7.2.3 近似统计 173
7.3 多桶型聚集 176
7.3.1 terms聚集 177
7.3.2 range聚集 183
7.3.3 histogram聚集 185
7.4 嵌套聚集 187
7.4.1 嵌套多桶聚集 189
7.4.2 通过嵌套聚集获得结果分组 190
7.4.3 使用单桶聚集 192
7.5 小结 196
第8章 文档间的关系 197
8.1 定义文档间关系的选项概览 197
8.1.1 对象类型 198
8.1.2 嵌套类型 200
8.1.3 父子关系 200
8.1.4 反规范化 200
8.2 将对象作为字段值 202
8.2.1 映射和索引对象 203
8.2.2 在对象中搜索 204
8.3 嵌套类型:联结嵌套的文档 206
8.3.1 映射并索引嵌套文档 207
8.3.2 搜索和聚集嵌套文档 210
8.4 父子关系:关联分隔的文档 216
8.4.1 子文档的索引、更新和删除 218
8.4.2 在父文档和子文档中搜索 220
8.5 反规范化:使用冗余的数据管理 227
8.5.1 反规范化的使用案例 228
8.5.2 索引、更新和删除反规范化的数据 230
8.5.3 查询反规范化的数据 233
8.6 应用端的连接 234
8.7 小结 235
第二部分
第9章 向外扩展 238
9.1 向Elasticsearch集群加入节点 238
9.2 发现其他Elasticsearch节点 241
9.2.1 通过广播来发现 241
9.2.2 通过单播来发现 242
9.2.3 选举主节点和识别错误 243
9.2.4 错误的识别 244
9.3 删除集群中的节点 245
9.4 升级Elasticsearch的节点 250
9.4.1 进行轮流重启 250
9.4.2 最小化重启后的恢复时间 251
9.5 使用_cat API 252
9.6 扩展策略 254
9.6.1 过度分片 254
9.6.2 将数据切分为索引和分片 255
9.6.3 最大化吞吐量 256
9.7 别名 257
9.7.1 什么是别名 258
9.7.2 别名的创建 259
9.8 路由 261
9.8.1 为什么使用路由 261
9.8.2 路由策略 262
9.8.3 使用_search_shards API来决定搜索在哪里执行 263
9.8.4 配置路由 265
9.8.5 结合路由和别名 265
9.9 小结 267
第10章 提升性能 268
10.1 合并请求 269
10.1.1 批量索引、更新和 删除 269
10.1.2 多条搜索和多条获取 API接口 273
10.2 优化Lucene分段的 处理 276
10.2.1 刷新和冲刷的阈值 276
10.2.2 合并以及合并策略 279
10.2.3 存储和存储限流 282
10.3 充分利用缓存 285
10.3.1 过滤器和过滤器 缓存 285
10.3.2 分片查询缓存 291
10.3.3 JVM堆和操作系统 缓存 293
10.3.4 使用预热器让缓存 热身 296
10.4 其他的性能权衡 297
10.4.1 大规模的索引还是 昂贵的搜索 298
10.4.2 调优脚本,要么 别用它 301
10.4.3 权衡网络开销,更少的 数据和更好的分布式 得分 305
10.4.4 权衡内存,进行深度 分页 308
10.5 小结 310
第11章 管理集群 311
11.1 改善默认的配置 311
11.1.1 索引模板 312
11.1.2 默认的映射 315
11.2 分配的感知 318
11.2.1 基于分片的分配 318
11.2.2 强制性的分配感知 319
11.3 监控瓶颈 320
11.3.1 检查集群的健康 状态 320
11.3.2 CPU:慢日志、热线程和 线程池 322
11.3.3 内存:堆的大小、字段和 过滤器缓存 326
11.3.4 操作系统缓存 330
11.3.5 存储限流 330
11.4 备份你的数据 331
11.4.1 快照API 331
11.4.2 将数据备份到共享的文件系统 332
11.4.3 从备份中恢复 335
11.4.4 使用资料库插件 336
11.5 小结 337
附录A 处理地理空间的数据(网上下载)
附录B 插件(网上下载)
附录C 高亮(网上下载)
附录D Elasticsearch的监控插件(网上下载)
附录E 使用渗滤器将搜索颠倒过来(网上下载)
附录F 为自动完成和“您是指”功能使用建议器(网上下载)
第1章 走进Elasticsearch
1.1 基本概念和原理
1.1.1 索引结构
1.1.2 分片(shard)
1.1.3 动态更新索引
1.1.4 近实时搜索
1.1.5 段合并
1.2 集群内部原理
1.2.1 集群节点角色
1.2.2 集群健康状态
1.2.3 集群状态
1.2.4 集群扩容
1.3 客户端API
1.4 主要内部模块简介
1.4.1 模块结构
1.4.2 模块管理
第2章 准备编译和调试环境
2.1 编译源码
2.1.1 准备JDK和Gradle
2.1.2 下载源代码
2.1.3 编译项目,打包
2.1.4 将工程导入IntelliJ IDEA
2.2 调试Elasticsearch
2.2.1 本地运行、调试项目
2.2.2 远程调试
2.3 代码书签和断点组
第3章 集群启动流程
3.1 选举主节点
3.2 选举集群元信息
3.3 allocation过程
3.4 index recovery
3.5 集群启动日志
3.6 小结
第4章 节点的启动和关闭
4.1 启动流程做了什么
4.2 启动流程分析
4.2.1 启动脚本
4.2.2 解析命令行参数和配置文件
4.2.3 加载安全配置
4.2.4 检查内部环境
4.2.5 检测外部环境
4.2.6 启动内部模块
4.2.7 启动keepalive线程
4.3 节点关闭流程
4.4 关闭流程分析
4.5 分片读写过程中执行关闭
4.6 主节点被关闭
4.7 小结
第5章 选主流程
5.1 设计思想
5.2 为什么使用主从模式
5.3 选举算法
5.4 相关配置
5.5 流程概述
5.6 流程分析
5.6.1 选举临时Master
5.6.2 投票与得票的实现
5.6.3 确立Master或加入集群
5.7 节点失效检测
5.7.1 NodesFaultDetection事件处理
5.7.2 MasterFaultDetection事件处理
5.8 小结
第6章 数据模型
6.1 PacificA算法
6.1.1 数据副本策略
6.1.2 配置管理
6.1.3 错误检测
6.2 ES的数据副本模型
6.2.1 基本写入模型
6.2.2 写故障处理
6.2.3 基本读取模型
6.2.4 读故障处理
6.2.5 引申的含义
6.2.6 系统异常
6.3 Allocation IDs
6.3.1 安全地分配主分片
6.3.2 将分配标记为陈旧
6.2.3 一个例子
6.3.4 不会丢失全部
6.4 Sequence IDs
6.4.1 Primary Terms和Sequence Numbers
6.4.2 本地及全局检查点
6.4.3 用于快速恢复(Recovery)
6.5 _version
第7章 写流程
7.1 文档操作的定义
7.2 可选参数
7.3 Index/Bulk基本流程
7.4 Index/Bulk详细流程
7.4.1 协调节点流程
7.4.2 主分片节点流程
7.4.3 副分片节点流程
7.5 I/O异常处理
7.5.1 Engine关闭过程
7.5.2 Master的对应处理
7.5.3 异常流程总结
7.6 系统特性
7.7 思考
第8章 GET流程
8.1 可选参数
8.2 GET基本流程
8.3 GET详细分析
8.3.1 协调节点
8.3.2 数据节点
8.4 MGET流程分析
8.5 思考
第9章 Search流程
9.1 索引和搜索
9.1.1 建立索引
9.1.2 执行搜索
9.2 search type
9.3 分布式搜索过程
9.3.1 协调节点流程
9.3.2 执行搜索的数据节点流程
9.4 小结
第10章 索引恢复流程分析
10.1 相关配置
10.2 流程概述
10.3 主分片恢复流程
10.4 副分片恢复流程
10.4.1 流程概述
10.4.2 synced flush机制
10.4.3 副分片节点处理过程
10.4.4 主分片节点处理过程
10.5 recovery速度优化
10.6 如何保证副分片和主分片一致
10.7 recovery相关监控命令
10.8 小结
第11章 gateway模块分析
11.1 元数据
11.2 元数据的持久化
11.3 元数据的恢复
11.4 元数据恢复流程分析
11.4.1 选举集群级和索引级别的元数据
11.4.2 触发allocation
11.5 思考
第12章 allocation模块分析
12.1 什么是allocation
12.2 触发时机
12.3 allocation模块结构概述
12.4 allocators
12.5 deciders
12.5.1 负载均衡类
12.5.2 并发控制类
12.5.3 条件限制类
12.6 核心reroute实现
12.6.1 集群启动时reroute的触发时机
12.6.2 流程分析
12.6.3 gatewayAllocator
12.6.4 shardsAllocator
12.7 从gateway到allocation流程的转换
12.8 从allocation流程到recovery流程的转换
12.9 思考
第13章 Snapshot模块分析
13.1 仓库
13.2 快照
13.2.1 创建快照
13.2.2 获取快照信息
13.2.3 快照status
13.2.4 取消、删除快照和恢复操作
13.3 从快照恢复
13.3.1 部分恢复
13.3.2 恢复过程中更改索引设置
13.3.3 监控恢复进度
13.4 创建快照的实现原理
13.4.1 Lucene文件格式简介
13.4.2 协调节点流程
13.4.3 主节点流程
13.4.4 数据节点流程
13.5 删除快照实现原理
13.5.1 协调节点流程
13.5.2 主节点流程
13.6 思考与总结
第14章 Cluster模块分析
14.1 集群状态
14.2 内部封装和实现
14.2.1 MasterService
14.2.2 ClusterApplierService
14.2.3 线程池
14.3 提交集群任务
14.3.1 内部模块如何提交任务
14.3.2 任务提交过程实现
14.4 集群任务的执行过程
14.5 集群状态的发布过程
14.5.1 增量发布的实现原理
14.5.2 二段提交总流程
14.5.3 发布过程
14.5.4 提交过程
14.5.5 异常处理
14.6 应用集群状态
14.7 查看等待执行的集群任务
14.8 任务管理API
14.8.1 列出运行中的任务
14.8.2 取消任务
14.9 思考与总结
第15章 Transport模块分析
15.1 配置信息
15.1.1 传输模块配置
15.1.2 通用网络配置
15.2 Transport总体架构
15.2.1 网络层
15.2.2 服务层
15.3 REST解析和处理
15.4 RPC实现
15.4.1 RPC的注册和映射
15.4.2 根据Action获取处理类
15.5 思考与总结
第16章 ThreadPool模块分析
16.1 线程池类型
16.1.1 fixed
16.1.2 scaling
16.1.3 direct
16.1.4 fixed_auto_queue_size
16.2 处理器设置
16.3 查看线程池
16.3.1 cat thread pool
16.3.2 nodes info
16.3.3 nodes stats
16.3.4 nodes hot threads
16.3.5 Java的线程池结构
16.4 ES的线程池实现
16.4.1 ThreadPool类结构与初始化
16.4.2 fixed类型线程池构建过程
16.4.3 scaling类型线程池构建过程
16.4.4 direct类型线程池构建过程
16.4.5 fixed_auto_queue_size类型线程池构建过程
16.5 其他线程池
16.6 思考与总结
第17章 Shrink原理分析
17.1 准备源索引
17.2 缩小索引
17.3 Shrink的工作原理
17.3.1 创建新索引
17.3.2 创建硬链接
17.3.3 硬链接过程源码分析
第18章 写入速度优化
18.1 translog flush间隔调整
18.2 索引刷新间隔refresh_interval
18.3 段合并优化
18.4 indexing buffer
18.5 使用bulk请求
18.5.1 bulk线程池和队列
18.5.2 并发执行bulk请求
18.6 磁盘间的任务均衡
18.7 节点间的任务均衡
18.8 索引过程调整和优化
18.8.1 自动生成doc ID
18.8.2 调整字段Mappings
18.8.3 调整_source字段
18.8.4 禁用_all字段
18.8.5 对Analyzed的字段禁用Norms
18.8.6 index_options 设置
18.9 参考配置
18.10 思考与总结
第19章 搜索速度的优化
19.1 为文件系统cache预留足够的内存
19.2 使用更快的硬件
19.3 文档模型
19.4 预索引数据
19.5 字段映射
19.6 避免使用脚本
19.7 优化日期搜索
19.8 为只读索引执行force-merge
19.9 预热全局序号(global ordinals)
19.10 execution hint
19.11 预热文件系统cache
19.12 转换查询表达式
19.13 调节搜索请求中的batched_reduce_size
19.14 使用近似聚合
19.15 深度优先还是广度优先
19.16 限制搜索请求的分片数
19.17 利用自适应副本选择(ARS)提升ES响应速度
第20章 磁盘使用量优化
20.1 预备知识
20.1.1 元数据字段
20.1.2 索引映射参数
20.2 优化措施
20.2.1 禁用对你来说不需要的特性
20.2.2 禁用doc values
20.2.3 不要使用默认的动态字符串映射
20.2.4 观察分片大小
20.2.5 禁用_source
20.2.6 使用best_compression
20.2.7 Fource Merge
20.2.8 Shrink Index
20.2.9 数值类型长度够用就好
20.2.10 使用索引排序来排列类似的文档
20.2.11 在文档中以相同的顺序放置字段
20.3 测试数据
第21章 综合应用实践
21.1 集群层
21.1.1 规划集群规模
21.1.2 单节点还是多节点部署
21.1.3 移除节点
21.1.4 独立部署主节点
21.2 节点层
21.2.1 控制线程池的队列大小
21.2.2 为系统cache保留一半物理内存
21.3 系统层
21.3.1 关闭swap
21.3.2 配置Linux OOM Killer
21.3.3 优化内核参数
21.4 索引层
21.4.1 使用全局模板
21.4.2 索引轮转
21.4.3 避免热索引分片不均
21.4.4 副本数选择
21.4.5 Force Merge
21.4.6 Shrink Index
21.4.7 close索引
21.4.8 延迟分配分片
21.4.9 小心地使用fielddata
21.5 客户端
21.5.1 使用REST API而非Java API
21.5.2 注意429状态码
21.5.3 curl的HEAD请求
21.5.4 了解你的搜索计划
21.5.5 为读写请求设置比较长的超时时间
21.6 读写
21.6.1 避免搜索操作返回巨大的结果集
21.6.2 避免索引巨大的文档
21.6.3 避免使用多个_type
21.6.4 避免使用_all字段
21.6.5 避免将请求发送到同一个协调节点
21.7 控制相关度
第22章 故障诊断
22.1 使用Profile API定位慢查询
22.2 使用Explain API分析未分配的分片(Unassigned Shards)
22.2.1 诊断未分配的主分片
22.2.2 诊断未分配的副分片
22.2.3 诊断已分配的分片
22.3 节点CPU使用率高
22.4 节点内存使用率高
22.5 Slow Logs
22.6 分析工具
22.6.1 I/O信息
22.6.2 内存
22.6.3 CPU信息
22.6.4 网络连接和流量
22.7 小结
附录A 重大版本变化
1.1 Apache Lucene简介1
1.1.1 熟悉Lucene2
1.1.2 Lucene的总体架构2
1.1.3 分析数据4
1.1.4 Lucene查询语言5
1.2 何为Elasticsearch8
1.2.1 Elasticsearch的基本概念8
1.2.2 Elasticsearch架构背后的关键概念10
1.2.3 Elasticsearch的工作流程10
1.3 在线书店示例14
1.4 小结17
第2章 查询DSL进阶18
2.1 Apache Lucene默认评分公式解释18
2.1.1 何时文档被匹配上19
2.1.2 TF/IDF评分公式19
2.1.3 Elasticsearch如何看评分21
2.1.4 一个例子21
2.2 查询改写24
2.2.1 前缀查询示例24
2.2.2 回到Apache Lucene26
2.2.3 查询改写的属性28
2.3 查询模板30
2.3.1 引入查询模板31
2.3.2 Mustache模板引擎33
2.3.3 把查询模板保存到文件35
2.4 过滤器的使用及作用原理36
2.4.1 过滤及查询相关性36
2.4.2 过滤器的工作原理40
2.4.3 性能考量41
2.4.4 后置过滤和过滤查询42
2.4.5 选择正确的过滤方式44
2.5 选择正确的查询方式45
2.5.1 查询方式分类45
2.5.2 使用示例50
2.6 小结65
第3章 不只是文本搜索66
3.1 查询二次评分66
3.1.1 什么是查询二次评分67
3.1.2 一个查询例子67
3.1.3 二次评分查询的结构67
3.1.4 二次评分参数70
3.1.5 总结70
3.2 多匹配控制71
3.3 重要词项聚合78
3.3.1 一个例子79
3.3.2 选择重要词项81
3.3.3 多值分析81
3.3.4 额外的配置84
3.3.5 使用限制89
3.4 文档分组89
3.4.1 top_hits聚合90
3.4.2 一个例子90
3.5 文档关系95
3.5.1 对象类型95
3.5.2 嵌套文档98
3.5.3 parent-child关系99
3.5.4 其他解决方案102
3.6 Elasticsearch各版本中脚本的变化102
3.6.1 脚本变迁102
3.6.2 Groovy简单介绍103
3.6.3 全文检索中的脚本108
3.6.4 Lucene表达式115
3.7 小结118
第4章 改善用户搜索体验119
4.1 改正用户拼写错误119
4.1.1 测试数据120
4.1.2 深入技术细节121
4.1.3 suggester121
4.2 改善查询相关性142
4.2.1 数据142
4.2.2 改善相关性的探索之旅145
4.3 小结157
第5章 分布式索引架构159
5.1 选择合适的分片和副本数159
5.1.1 分片和过度分配160
5.1.2 一个过度分配的正面例子161
5.1.3 多分片与多索引161
5.1.4 副本161
5.2 路由162
5.2.1 分片和数据162
5.2.2 测试路由功能162
5.2.3 索引时使用路由166
5.2.4 别名169
5.2.5 多个路由值169
5.3 调整默认分片的分配行为170
5.3.1 部署意识171
5.3.2 过滤173
5.3.3 运行时更新分配策略174
5.3.4 确定每个节点允许的总分片数175
5.3.5 确定每个物理机器允许的总分片数175
5.4 查询执行偏好179
5.5 小结181
第6章 底层索引控制182
6.1 改变Apache Lucene的评分方式182
6.1.1 可用的相似度模型183
6.1.2 为每字段配置相似度模型183
6.1.3 相似度模型配置184
6.1.4 选择默认的相似度模型185
6.2 选择适当的目录实现—store模块188
6.3 准实时、提交、更新及事务日志191
6.3.1 索引更新及更新提交192
6.3.2 事务日志193
6.3.3 准实时读取194
6.4 控制索引合并195
6.4.1 选择正确的合并策略196
6.4.2 合并策略配置197
6.4.3 调度199
6.5 关于I/O调节200
6.5.1 控制I/O节流200
6.5.2 配置200
6.6 理解Elasticsearch缓存202
6.6.1 过滤器缓存203
6.6.2 字段数据缓存204
6.6.3 查询分片缓存212
6.6.4 使用circuit breaker213
6.6.5 清除缓存214
6.7 小结215
第7章 管理Elasticsearch216
7.1 发现和恢复模块216
7.1.1 发现模块的配置217
7.1.2 主节点218
7.1.3 网关和恢复模块的配置223
7.1.4 索引恢复API226
7.2 使用人类友好的Cat API 229
7.2.1 基础知识230
7.2.2 使用Cat API231
7.2.3 一些例子232
7.3 备份232
7.4 联盟搜索236
7.4.1 测试用的集群236
7.4.2 建立部落节点237
7.4.3 通过部落节点读取数据238
7.4.4 通过部落节点写入数据239
7.4.5 处理索引冲突240
7.4.6 屏蔽写操作241
7.5 小结242
第8章 提高性能243
8.1 使用doc values来优化查询243
8.1.1 字段缓存存在的问题244
8.1.2 使用doc values的例子245
8.2 了解垃圾回收器247
8.2.1 Java内存248
8.2.2 解决垃圾回收问题249
8.2.3 在类UNIX系统上避免内存交换254
8.3 对查询做基准测试255
8.3.1 为基准测试配置集群256
8.3.2 进行基准测试256
8.3.3 控制运行中的基准测试259
8.4 热点线程261
8.4.1 热点线程的使用说明261
8.4.2 热点线程API的响应262
8.5 扩展Elasticsearch263
8.5.1 垂直扩展263
8.5.2 水平扩展264
8.5.3 在高负载的场景下使用Elasticsearch271
8.6 小结283
第9章 开发Elasticsearch插件284
9.1 创建Maven项目284
9.2 了解基本知识285
9.2.1 Maven Java项目的结构285
9.2.2 POM的理念285
9.2.3 执行构建过程286
9.2.4 引入Maven装配插件287
9.3 创建自定义REST行为289
9.3.1 设定289
9.3.2 实现细节289
9.4 创建自定义分析插件295
9.4.1 实现细节295
9.4.2 测试自定义分析插件302
第1章 信息检索模型 1
1.1 信息检索概述 1
1.1.1 信息过载 1
1.1.2 信息检索定义 2
1.1.3 信息检索常用术语 3
1.1.4 信息检索系统 4
1.2 分词算法 5
1.2.1 分词算法概述 5
1.2.2 词典匹配分词法 6
1.2.3 语义理解分词法 6
1.2.4 词频统计分词法 7
1.3 倒排索引 7
1.4 布尔检索模型 9
1.5 tf-idf权重计算 11
1.6 向量空间模型 13
1.7 概率检索模型 16
1.7.1 贝叶斯决策理论 17
1.7.2 二值独立模型 18
1.7.3 Okapi BM25模型 20
1.7.4 BM25F模型 20
1.8 本章小结 21
第2章 Lucene开发入门 22
2.1 Lucene概述 22
2.1.1 Lucene简介 22
2.1.2 Lucene特点 22
2.1.3 Lucene架构 23
2.2 Lucene开发准备 25
2.2.1 下载Lucene文件库 25
2.2.2 工程中引入Lucene 26
2.2.3 下载Luke 27
2.2.4 下载IK分词工具 28
2.2.5 工程搭建 29
2.3 Lucene分词详解 30
2.3.1 Lucene分词系统 30
2.3.2 分词器测试 31
2.3.3 IK分词器配置 34
2.3.4 中文分词器对比 36
2.3.5 扩展停用词词典 38
2.3.6 扩展自定义词典 38
2.4 Lucene索引详解 40
2.4.1 Lucene字段类型 40
2.4.2 索引文档示例 41
2.4.3 Luke中查看索引 46