Lucene實戰(第2版)
內容描述
《Lucene實戰(第 2版)》基於Apache的Lucene 3.0,從Lucene核心、Lucene應用、案例分析3個方面詳細系統地介紹了Lucene,包括認識Lucene、建立索引、為應用程序添加搜索功能、搜索技術、擴展搜索、使用Tika提取文本、Lucene的擴展、使用其他編程語言訪問Lucene、Lucene管理和性能調優等內容,後還提供了三大經典成功案例,為讀者展示了一個奇妙的搜索世界
《Lucene實戰(第 2版)》適合於已具有一定Java編程基本的讀者,以及希望能夠把強大的搜索功能添加到自己的應用程序中的開發人員。《Lucene實戰(第 2版)》對於從事搜索引擎工作的工程技術人員,以及在Java平臺上進行各類軟件開發的人員和編程愛好者,也具有很好的學習參考價值。
目錄大綱
第1部分Lucene核心
第1章初識Lucene 3
1.1應對信息爆炸4
1.2 Lucene是什麼5
1.2.1 Lucene能做些什麼6
1.2.2 Lucene的歷史7
1.3 Lucene和搜索程序組件9
1.3.1索引組件10
1.3.2搜索組件13
1.3.3搜索程序的其他模塊16
1.3.4 Lucene與應用程序的整合點18
1.4 Lucene實戰:程序示例18
1.4.1建立索引19
1.4.2搜索索引22
1.5理解索引過程的核心類25
1.5.1 IndexWriter 25
1.5.2 Directory 25
1.5.3 Analyzer 26
1.5.4 Document 26
1.5.5 Field 27
1.6理解搜索過程的核心類27
1.6.1 IndexSearcher 27
1.6.2 Term 28
1.6. 3 Query 28
1.6.4 TermQuery 28
1.6.5 TopDocs 29
1.7小結29
第2章構建索引30
2.1 Lucene如何對搜索內容進行建模31
2.1.1文檔和域31
2.1.2靈活的架構32
2.1.3反向規格化(Denormalization) 32
2.2理解索引過程33
2.2 .1提取文本和創建文檔33
2.2.2分析文檔34
2.2.3向索引添加文檔34
2.3基本索引操作35
2.3.1向索引添加文檔35
2.3.2刪除索引中的文檔38
2.3.3更新索引中的文檔39
2.4域選項41
2.4.1域索引選項41
2.4.2域存儲選項42
2.4.3域的項向量選項42
2.4.4 Reader、TokenStream和byte[ ]域值42
2.4.5域選項組合43
2.4.6域排序選項44
2.4.7多值域44
2.5對文檔和域進行加權操作45
2.5.1文檔加權操作45
2.5.2域加權操作46
2.5.3加權基準(Norms) 47
2.6索引數字、日期和時間48
2.6.1索引數字48
2.6.2索引日期和時間49
2.7域截取(Field truncation) 50
2.8近實時搜索(Near-real-time search) 51
2.9優化索引51
2.10其他Directory子類52
2.11並發、線程安全及鎖機制55
2.11. 1線程安全和多虛擬機安全55
2.11.2通過遠程文件系統訪問索引56
2.11.3索引鎖機制57
2.12調試索引59
2.13索引概念60
2.13.1用IndexReader刪除文檔61
2.13.2回收被刪除文檔所使用過的磁盤空間62
2.13.3緩沖和刷新62
2.13.4索引提交63
2.13.5 ACID事務和索引連續性65
2.13.6合併段66
2.14小結68
第3章為應用程序添加搜索功能70
3.1實現簡單的搜索功能71
3.1.1對特定項的搜索72
3.1.2解析用戶輸入的查詢表達式:QueryParser 73
3.2使用IndexSearcher類76
3.2.1創建IndexSearcher類76
3.2.2實現搜索功能78
3.2.3使用TopDocs類78
3.2.4搜索結果分頁79
3.2.5近實時搜索79
3.3理解Lucene的評分機制81
3.3.1 Lucene如何評分81
3.3.2使用explain()理解搜索結果評分83
3.4 Lucene的多樣化查詢84
3.4.1通過項進行搜索:TermQuery類85
3.4.2在指定的項範圍內搜索:TermRangeQuery類86
3.4.3在指定的數字範圍內搜索:NumericRangeQuery類87
3.4.4通過字符串搜索:PrefixQuery類88
3.4.5組合查詢:BooleanQuery類88
3.4.6通過短語搜索:PhraseQuery類91
3.4.7通配符查詢:WildcardQuery類93
3.4.8搜索類似項:FuzzyQuery類94
3.4.9匹配所有文檔:MatchAllDocsQuery類95
3.5解析查詢表達式:QueryParser 96
3.5.1 Query.toString方法97
3.5.2 TermQuery 97
3.5.3項範圍查詢98
3.5.4數值範圍搜索和日期範圍搜索99
3.5.5前綴查詢和通配符查詢99
3.5.6布爾操作符100
3.5.7短語查詢100
3.5.8模糊查詢101
3.5.9 MatchAllDocsQuery 102
3.5.10分組查詢102
3.5.11域選擇103
3.5.12為子查詢設置加權103
3.5.13是否一定要使用QueryParse 103
3.6小結104
第4章Lucene的分析過程105
4.1使用分析器106
4.1.1索引過程中的分析107
4.1.2 QueryParser分析109
4.1.3解析vs分析:分析器何時不再適用109
4.2剖析分析器110
4.2.1語彙單元的組成111
4.2.2語彙單元流揭秘112
4.2.3觀察分析器115
4.2.4語彙單元過濾器:過濾順序的重要性119
4.3使用內置分析器121
4.3. 1 StopAnalyzer 122
4.3.2 StandardAnalyzer 122
4.3.3應當採用哪種核心分析器123
4.4近音詞查詢123
4.5同義詞、別名和其他表示相同意義的詞126
4.5.1創建SynonymAnalyzer 127
4.5.2顯示語彙單元的位置131
4.6詞幹分析132
4.6.1 StopFilter保留空位133
4.6.2合併詞幹操作和停用詞移除操作134
4.7域分析134
4.7.1多值域分析135
4.7. 2特定域分析135
4.7.3搜索未被分析的域136
4.8語言分析139
4.8.1 Unicode與字符編碼139
4.8.2非英語語種分析140
4.8.3字符規範化處理140
4.8.4亞洲語種分析141
4.8 .5有關非英語語種分析的其他問題143
4.9 Nutch分析144
4.10小結146
第5章搜索技術147
5.1 Lucene域緩存148
5.1.1為所有文檔加載域值149
5.1.2段對應的reader 149
5.2對搜索結果進行排序150
5.2.1根據域值進行排序150
5.2.2按照相關性進行排序153
5.2.3按照索引順序進行排序154
5.2.4通過域進行排序154
5.2.5倒排序155
5.2.6通過多個域進行排序156
5.2.7為排序域選擇類型157
5.2.8使用非默認的locale方式進行排序157
5.3使用MultiPhraseQuery 158
5.4針對多個域的一次性查詢160
5.5跨度查詢162
5.5.1跨度查詢的構建模塊:SpanTermQuery 165
5.5.2在域的起點查找跨度166
5.5.3彼此相鄰的跨度167
5.5.4在匹配結果中排除重疊的跨度169
5.5.5 SpanOrQuery類170
5.5.6 SpanQuery類和QueryParser類171
5.6搜索過濾172
5.6.1 TermRangeFilter 173
5.6.2 NumericRangeFilter 174
5.6.3 FieldCacheRangeFilter 174
5.6.4特定項過濾174
5.6.5使用QueryWrapperFilter類175
5.6.6使用SpanQueryFilter類175
5.6.7安全過濾器176
5.6.8使用BooleanQuery類進行過濾177
5.6.9 PrefixFilter 178
5.6.10緩存過濾結果178
5.6.11將filter封裝成query 179
5.6.12對過濾器進行過濾179
5.6.13非Lucene內置的過濾器180
5.7使用功能查詢實現自定義評分180
5.7.1功能查詢的相關類180
5.7.2使用功能查詢對近修改過的文檔進行加權182
5.8針對多索引的搜索184
5.8.1使用MultiSearch類184
5.8.2使用ParallelMultiSearcher進行多線程搜索186
5.9使用項向量186
5.9.1查找相似書籍187
5.9.2它屬於哪個類別190
5.9.3 TermVectorMapper類193
5.10使用FieldSelector加載域194
5.11停止較慢的搜索195
5.12小結196
第6章擴展搜索198
6.1使用自定義排序方法199
6.1.1針對地理位置排序方式進行文檔索引199
6.1.2實現自定義的地理位置排序方式200
6.1.3訪問自定義排序中的值203
6.2開發自定義的Collector 204
6.2.1 Collector基類205
6.2.2自定義Collector:BookLinkCollector 206
6.2.3 AllDocCollector類207
6.3擴展QueryParser類208
6.3.1自定義QueryParser的行為208
6.3.2禁用模糊查詢和通配符查詢209
6.3.3處理數值域的範圍查詢210
6.3.4處理日期範圍211
6.3.5對已排序短語進行查詢213
6.4自定義過濾器215
6.4.1實現自定義過濾器215
6.4.2搜索期間使用自定義過濾器216
6.4.3另一種選擇:FilterQuery類217
6.5有效載荷(Payloads) 218
6.5.1分析期間生成有效載荷219
6.5.2搜索期間使用有效載荷220
6.5.3有效載荷和跨度查詢223
6.5.4通過TermPositions來檢索有效載荷223
6.6小結223
第2部分Lucene應用
第7章使用Tika提取文本227
7.1 Tika是什麼228
7.2 Tika的邏輯設計和API 230
7.3安裝Tika 231
7.4 Tika的內置文本提取工具232
7.5編程實現文本提取234
7.5.1索引Lucene文檔234
7.5.2 Tika工具類237
7.5.3選擇自定義分析器238
7.6 Tika的局限238
7.7索引自定義的XML文件239
7.7.1使用SAX進行解析239
7.7.2使用Apache Commons Digester進行解析和索引242
7.8其他選擇244
7.9小結245
第8章Lucene基本擴展246
8.1 Luke:Lucene的索引工具箱247
8.1.1 Overview標籤頁:索引的全局視圖248
8.1.2瀏覽文檔249
8.1.3使用QueryParser進行搜索251
8.1. 4 Files and Plugins標籤頁252
8.2分析器、語彙單元器和語彙單元過濾器253
8.2.1 SnowballAnalyzer 255
8.2.2 Ngram過濾器256
8.2.3 Shingle過濾器258
8.2.4獲取捐贈分析器258
8.3高亮顯示查詢項259
8.3.1高亮顯示模塊259
8.3.2獨立的高亮顯示示例262
8.3.3使用CSS進行高亮顯示處理263
8.3.4高亮顯示搜索結果264
8.4 FastVector Highlighter類266
8.5拼寫檢查269
8.5.1生成提示列表269
8.5.2選擇提示271
8.5.3向用戶展示搜索結果272
8.5.4一些加強拼寫檢查的考慮273
8.6引人注目的查詢擴展功能274
8.6.1 MoreLikeThis 274
8.6.2 FuzzyLikeThisQuery 275
8.6.3 BoostingQuery 275
8.6.4 TermsFilter 276
8.6.5 DuplicateFilter 276
8.6.6 RegexQuery 276
8.7構建軟件捐贈模塊(contrib module) 277
8.7.1源代碼獲取方式277
8.7. 2 contrib目錄的Ant插件277
8.8小結278
第9章Lucene擴展279
9.1鍊式過濾器280
9.2使用Berkeley DB存儲索引282
9.3 WordNet同義詞284
9.3.1建立同義詞索引285
9.3.2將WordNet同義詞鏈接到分析器中287
9.4基於內存的快速索引289
9.5 XML QueryParser:超出“one box”的搜索接口289
9.5.1使用XmlQueryParser 291
9.5.2擴展XML查詢語法295
9.6外圍查詢語言296
9.7 Spatial Lucene 298
9.7.1索引空間數據299
9.7.2搜索空間數據302
9.7.3 Spatial Lucene的性能特點304
9.8遠程進行多索引搜索306
9.9靈活的QueryParser 309
9.10其他內容312
9.11小結313
第10章其他編程語言使用Lucene 314
10.1移植入門315
10.1.1移植取捨316
10.1.2選擇合適的移植版本317
10.2 CLucene(C++) 317
10.2.1移植目的318
10.2.2 API和索引兼容319
10.2.3支持的平台321
10.2.4當前情況以及未來展望321
10.3 Lucene.Net(C#和其他.NET編程語言) 321
10.3.1 API兼容323
10.3.2索引兼容324
10.4 KinoSearch和Lucy(Perl) 324
10.4.1 KinoSearch 325
10.4.2 Lucy 327
10.4.3其他Perl選項327
10.5 Ferret(Ruby) 328
10.6 PHP 329
10.6.1 Zend Framework 329
10.6.2 PHP Bridge 330
10.7 PyLucene(Python) 330
10.7.1 API兼容332
10.7.2其他Python選項332
10.8 Solr(包含多種編程語言) 332
10.9小結334
第11章Lucene管理和性能調優335
11.1性能調優336
11.1.1簡單的性能調優步驟337
11.1.2測試方法338
11.1.3索引-搜索時延調優339
11.1.4索引操作吞吐量調優340
11.1.5搜索時延和搜索吞吐量調優344
11.2多線程和並行處理346
11.2.1使用多線程進行索引操作347
11.2.2使用多線程進行搜索操作351
11.3資源消耗管理354
11.3.1磁盤空間管理354
11.3.2文件描述符管理357
11.3.3內存管理361
11.4熱備份索引364
11.4.1創建索引備份365
11.4.2恢復索引366
11.5常見錯誤367
11.5.1索引損壞367
11.5.2修復索引369
11.6小結369
第3部分案例分析
第12章案例分析1:Krugle 373
12.1 Krugle介紹374
12.2應用架構375
12.3搜索性能376
12.4源代碼解析377
12.5子串搜索378
12.6查詢VS搜索381
12.7改進空間382
12.7.1 FieldCache內存使用382
12.7.2合併索引382
12.8小結383
第13章案例分析2:SIREn 384
13.1 SIREn介紹385
13.2 SIREn優勢385
13.2.1通過所有域進行搜索387
13.2.2一種高效詞典388
13.2.3可變域388
13.2.4對多值域的高效處理388
13.3使用SIREn索引實體388
13.3.1數據模型389
13.3.2實現問題389
13.3.3索引概要390
13.3.4索引前的數據準備390
13.4使用SIREn搜索實體392
13.4.1搜索內容392
13.4.2根據單元限制搜索範圍393
13.4.3將單元合併成元組393
13.4.4針對實體描述進行查詢394
13.5在Solr中集成SIREn 394
13.6 Benchmark 395
13.7小結397
第14章案例分析3:LinkedIn 398
14.1使用Bobo Browse進行分組搜索398
14.1.1 Bobo Browse的設計400
14.1.2深層次分組搜索403
14.2使用Zoie進行實時搜索405
14.2.1 Zoie架構406
14.2.2實時VS近實時409
14.2.3文檔與索引請求411
14.2.4自定義IndexReaders 411
14.2.5與Lucene的近實時搜索進行比較412
14.2 .6分佈式搜索413
14.3小結415
附錄A安裝Lucene 416
A.1二進製文件安裝416
A.2運行命令行演示程序417
A.3運行Web應用演示程序418
A.4編譯源代碼419
A.5排錯420
附錄B Lucene索引格式421
B.1邏輯索引視圖421
B.2關於索引結構422
B.2.1理解多文件索引結構422
B.2.2理解複合索引結構425
B.2.3轉換索引結構426
B.3倒排索引427
B.4小結430
附錄C Lucene/contrib benchmark 431
C.1運行測試腳本432
C.2測試腳本的組成部分435
C.2.1內容源和文檔生成器438
C.2.2查詢生成器439
C.3控制結構439
C.4內置任務441
C.4.1建立和使用行文件445
C.4.2內置報表任務446
C.5評估搜索質量446
C.6出錯處理449
C.7小結449
附錄D資源450
D.1 Lucene知識庫450
D.2國際化450
D.3語言探測451
D.4項向量451
D.5 Lucene移植版本451
D.6案例分析452
D.7其他452
D.8信息檢索軟件452
D.9 Doug Cutting的著作453
D.9.1會議論文453
D.9.2美國專利454
作者介紹
作者:(美)麥肯德利斯