Elasticsearch搜索集群系統在生產和生活中發揮著越來越重要的作用。本書介紹了Elasticsearch的使用、原理、系統優化與擴展應用。本書用例子說明了Java、Python、Scala和PHP的編程API,其中在Java搜索界面實現上,介紹了使用Spring實現微服務開發。為了擴展Elasticsearch的功能,本書以中文分詞和英文文本分析為例介紹了插件開發方法。本書介紹了使用Elasticsearch作為數據管理平臺的日志監控與分析方法,介紹了使用OCR從圖像中提取文本以及問答式搜索的開發方法。
智慧生物的大規模協作造就了驚人的進化奇跡。大規模機器集群造就機器系統進化成為強大的智能系統。Elasticsearch作為大數據與搜索引擎技術的結合體,隨著社會對大規模開源分布式搜索引擎的需求迅速成長。
由于其良好的易用性,Elasticsearch早在1.0版本之前就加速了大規模搜索集群的普及。本書從基本概念開始熟悉Elasticsearch,接下來介紹了Elasticsearch在Windows和Linux操作系統下的安裝。除了CURL命令,本書還介紹了使用常用的編程工具和Elasticsearch搜索服務交互,包括Java、Python、Scala和PHP,以及使用SQL語句查詢Elasticsearch索引的方法。自然語言文本理解往往以插件形式存在于Elasticsearch集群中,第2章介紹了如何開發與測試插件。因為Elasticsearch經常用于實時搜索或分析,所以性能優化很重要,第3章介紹了如何管理Elasticsearch集群。為了更合理地使用和擴展Elasticsearch,第4章簡單分析了github中托管的Elasticsearch源代碼。對于搜索引擎來說,返回結果的相關性是一個重要的話題,第5章討論了這個問題。第6章介紹了使用Java開發搜索引擎Web用戶界面的幾種方法。
隨著人工智能領域技術的發展,讓搜索引擎智能加速變成現實。智能搜索引擎需要能夠檢測到并識別出圖像中的文字,第7章介紹了結合OpenCV使用Tesseract識別文字的方法。第8章介紹了根據問題返回搜索結果的問答式搜索。
目前Elasticsearch是實時系統監控的首選,第9章介紹了使用Elasticsearch監控與分析日志,也介紹了通過物聯網監控系統的方案。
本書相關的參考軟件和代碼在讀者QQ群471033528的附件中可以找到。Elasticsearch及其底層依賴的軟件,其復雜程度已經超越了一個人所能掌握的程度。一些具體的細節也可以在讀者QQ群中討論。感謝早期合著者、合作伙伴、員工、學員、讀者的支持,給我們提供了良好的工作基礎。就像玻璃容器中的水培植物一樣,這是一個持久可用的工作基礎。技術的融合與創新無止境,歡迎讀者一起探索。
本書適合需要具體實現搜索引擎的程序員使用,對于信息檢索等相關領域的研究人員也有一定的參考價值,同時獵兔搜索技術團隊已經開發出以本書為基礎的專門培訓課程和商業軟件。
參與本書編寫的還有張子憲、崔智杰、張曉斐、石天盈、張繼紅、張進威、劉宇、何淑琴、任通通、高丹丹、徐友峰、孫寬,在此一并表示感謝。
獵兔搜索技術創始人曾經擔任國防大學科研處 技術顧問工信部 輿情開發顧問東南大學 社會導師首都師范大學 金融課程講師北京石油化工學院 社會導師北大光華管理學院 技術顧問藍汛公司搜索集群技術咨詢顧問新東方 創新研究院 研究員
第1章 使用Elasticsearch1
1.1 基本概念1
1.2 安裝2
1.3 搜索集群5
1.4 創建索引6
1.5 使用Java客戶端接口9
1.5.1 創建索引11
1.5.2 增加、刪除與修改數據14
1.5.3 分析器16
1.5.4 數據導入17
1.5.5 通過攝取快速導入數據17
1.5.6 索引庫結構17
1.5.7 查詢18
1.5.8 區間查詢22
1.5.9 排序23
1.5.10 分布式搜索23
1.5.11 過濾器24
1.5.12 高亮顯示24
1.5.13 分頁25
1.5.14 通過聚合實現分組查詢26
1.5.15 文本列的聚合27
1.5.16 遍歷數據28
1.5.17 索引文檔29
1.5.18 Percolate29
1.6 RESTClient30
1.6.1 使用攝取31
1.6.2 代碼實現攝取33
1.7 使用Jest33
1.8 Python客戶端37
1.9 Scala客戶端40
1.10 PHP客戶端43
1.11 SQL支持44
1.12 本章小結48
第2章 開發插件49
2.1 搜索中文49
2.1.1 中文分詞原理49
2.1.2 中文分詞插件原理51
2.1.3 開發中文分詞插件53
2.1.4 中文AnalyzerProvider55
2.1.5 字詞混合索引57
2.2 搜索英文60
2.2.1 句子切分60
2.2.2 標注詞性62
2.3 使用測試套件64
2.4 本章小結68
第3章 管理搜索集群69
3.1 節點類型69
3.2 管理集群69
3.3 寫入權限控制70
3.4 使用X-Pack71
3.5 快照72
3.6 Zen發現機制73
3.7 聯合搜索74
3.8 緩存74
3.9 本章小結75
第4章 源碼分析76
4.1 Lucene源碼分析76
4.1.1 Ivy管理依賴項76
4.1.2 源碼結構介紹76
4.2 Gradle77
4.3 Guice77
4.4 Joda-Time79
4.5 Transport80
4.6 線程池80
4.7 模塊80
4.8 Netty81
4.9 分布式81
4.10 本章小結82
第5章 搜索相關性83
5.1 BM25檢索模型83
5.1.1 使用BM25檢索模型86
5.1.2 參數調優86
5.2 學習評分86
5.2.1 基本原理87
5.2.2 準備數據87
5.2.3 Elasticsearch學習排名89
5.3 本章小結91
第6章 搜索引擎用戶界面92
6.1 JSP實現搜索界面92
6.1.1 用于顯示搜索結果的自定義標簽93
6.1.2 使用Listlib98
6.1.3 實現翻頁100
6.2 使用Spring實現的搜索界面102
6.2.1 實現REST搜索界面102
6.2.2 REST API中的HTTP PUT104
6.2.3 Spring-data-elasticsearch106
6.2.4 Spring HATEOAS112
6.3 實現搜索接口113
6.3.1 編碼識別113
6.3.2 布爾搜索116
6.3.3 搜索結果排序116
6.4 實現相似文檔搜索117
6.5 實現AJAX搜索聯想詞119
6.5.1 估計查詢詞的文檔頻率119
6.5.2 搜索聯想詞總體結構119
6.5.3 服務器端處理120
6.5.4 瀏覽器端處理125
6.5.5 拼音提示127
6.5.6 部署總結127
6.5.7 Suggester128
6.6 推薦搜索詞129
6.6.1 挖掘相關搜索詞130
6.6.2 使用多線程計算相關搜索詞132
6.7 查詢意圖理解133
6.7.1 拼音搜索133
6.7.2 無結果處理133
6.8 集成其他功能134
6.8.1 拼寫檢查134
6.8.2 分類統計135
6.8.3 相關搜索141
6.8.4 再次查找144
6.8.5 搜索日志144
6.9 查詢分析146
6.9.1 歷史搜索詞記錄146
6.9.2 日志信息過濾147
6.9.3 信息統計148
6.9.4 挖掘日志信息150
6.9.5 查詢詞意圖分析150
6.10 部署網站150
6.10.1 部署到Web服務器151
6.10.2 防止攻擊152
6.11 本章小結156
第7章 OCR文字識別157
7.1 Tesseract157
7.2 使用TensorFlow識別文字161
7.3 OpenCV164
7.3.1 預處理166
7.3.2 文字區域提取169
7.3.3 糾正偏斜171
7.3.4 Linux環境支持172
7.4 JavaCV172
7.5 本章小結174
第8章 問答式搜索176
8.1 生成表示語義的代碼176
8.2 信息整合181
8.2.1 實體對齊181
8.2.2 編輯距離181
8.2.3 Jaro-Winkler距離187
8.2.4 比較器189
8.2.5 Cleaner189
8.2.6 運行過程190
8.2.7 遺傳算法調整參數192
8.3 自動問答193
8.3.1 問句處理器193
8.3.2 自動發現答案198
8.4 本章小結199
第9章 Elastic系統監控201
9.1 Logstash201
9.1.1 使用Logstash201
9.1.2 插件203
9.1.3 數據庫輸入插件206
9.2 Filebeat207
9.3 消息過期208
9.4 Kibana208
9.5 Flume209
9.6 Kafka210
9.7 Graylog211
9.8 物聯網數據215
9.9 本章小結216