编辑推荐

猎兔搜索工程师数十年技术积淀与升华,讲解分布式搜索引擎的基本算法与原理。ElasticSearch分布式集群实践经验的总结,带领读者快速入门分布式搜索引擎开发。

内容简介

自己动手写分布式搜索引擎》介绍了分布式搜索引擎开发的原理与Java实现,主要包括全文检索的原理与实现、分布式算法与代码实现、SolrCloud和ElasticSearch的使用与原理等内容,并着重介绍了一种实现分布式中文搜索引擎的方法。
自己动手写分布式搜索引擎》适合有Java程序设计基础的开发人员或者对分布式搜索引擎技术感兴趣的从业人员使用

作者简介

罗刚,计算机软件硕士,毕业于吉林工业大学。2005年创立北京盈智星科技发展有限公司,2008年联合创立上海数聚软件公司。猎兔搜索创始人,当前猎兔搜索在北京、上海以及石家庄均设有研发部。他带领猎兔搜索技术开发团队先后开发出猎兔中文分词系统、猎兔文本挖掘系统,智能垂直搜索系统以及网络信息监测系统等,实现互联网信息的采集、过滤、搜索和实时监测,其开发的搜索软件日用户访问量万次以上。

目录

第1章搜索引擎1
1.1搜索引擎基本模块2
1.2开发环境3
1.3搜索引擎工作原理4
1.3.1网络爬虫5
1.3.2全文索引5
1.3.3搜索用户界面8
1.3.4分布式计算9
1.3.5文本挖掘9
1.4算法基础9
1.4.1折半查找10
1.4.2排序10
1.4.3最小生成树12
1.5软件工具15
1.6单元测试15
1.7本章小结17
1.8术语表18
第2章自己动手写全文检索19
2.1构建索引22
2.2生成索引文件23
2.3读入索引文件25
2.4查询26
2.5有限状态机29
2.5.1运算29
2.5.2编辑距离有限状态机30
2.6本章小结32
第3章Lucene的原理与应用33
3.1Lucene快速入门34
3.1.1创建索引34
3.1.2查询索引库35
3.1.3创建文档索引36
3.1.4查询文档索引36
3.2创建和维护索引库37
3.2.1设计索引库结构37
3.2.2创建索引库38
3.2.3向索引库中添加索引文档40
3.2.4删除索引库中的索引文档43
3.2.5更新索引库中的索引文档44
3.2.6关闭索引库45
3.2.7索引的优化与合并45
3.2.8灵活索引46
3.2.9索引文件格式47
3.2.10定制索引存储结构49
3.2.11写索引集成到爬虫54
3.2.12多线程写索引56
3.2.13分发索引58
3.2.14修复索引61
3.3查找索引库61
3.3.1查询过程61
3.3.2常用查询64
3.3.3基本词查询65
3.3.4模糊匹配65
3.3.5布尔查询67
3.3.6短语查询69
3.3.7跨度查询71
3.3.8FieldScoreQuery74
3.3.9排序77
3.3.10使用Filter筛选搜索结果81
3.3.11使用Collector筛选搜索
结果82
3.3.12遍历索引库85
3.3.13关键词高亮显示88
3.3.14列合并91
3.3.15关联内容(BlockJoinQuery)92
3.3.16查询大容量索引94
3.4读写并发95
3.5Lucene深入介绍95
3.5.1整体结构96
3.5.2索引原理97
3.5.3文档值100
3.5.4FST102
3.6查询语法与解析102
3.6.1JavaCC104
3.6.2生成一个查询解析器114
3.6.3简单的查询解析器114
3.6.4灵活的查询解析器114
3.7检索模型119
3.7.1向量空间模型121
3.7.2DFR125
3.7.3BM25概率模型130
3.7.4BM25F概率模型136
3.7.5统计语言模型138
3.7.6相关性反馈140
3.7.7隐含语义索引140
3.7.8学习评分141
3.7.9查询与相关度142
3.7.10使用Payload调整相关性142
3.8查询原理146
3.8.1布尔匹配147
3.8.2短语查询150
3.8.3索引统计150
3.8.4相关性152
3.9分析文本155
3.9.1Analyzer156
3.9.2TokenStream162
3.9.3定制Tokenizer164
3.9.4重用Tokenizer166
3.9.5有限状态转换167
3.9.6索引数值列168
3.9.7检索结果排序171
3.9.8处理价格171
3.10Lucene中的压缩算法172
3.10.1变长压缩172
3.10.2Gamma174
3.10.3PForDelta176
3.10.4VSEncoding178
3.10.5前缀压缩179
3.10.6差分编码180
3.10.7静态索引裁剪182
3.11搜索中文182
3.11.1Lucene切分原理185
3.11.2Lucene中的Analyzer186
3.11.3自己写Analyzer188
3.11.4Lietu中文分词191
3.11.5字词混合索引191
3.12搜索英文196
3.12.1英文分词196
3.12.2词性标注199
3.12.3原型化201
3.13索引数据库中的文本202
3.14优化使用Lucene204
3.14.1系统优化204
3.14.2查询优化205
3.14.3实现时间加权排序207
3.14.4词性标注210
3.14.5个性化搜索213
3.15实时搜索213
3.16语义搜索215
3.16.1发现同义词215
3.16.2垂直领域同义词219
3.16.3同义词扩展219
3.16.4语义标注225
3.17本章小结225
3.18术语表226
第4章搜索引擎用户界面227
4.1实现Lucene搜索228
4.1.1测试搜索功能228
4.1.2加载索引229
4.2搜索页面设计231
4.2.1Struts2实现的搜索界面232
4.2.2用于显示搜索结果的
Taglib234
4.2.3实现翻页235
4.3实现搜索接口238
4.3.1编码识别238
4.3.2布尔搜索241
4.3.3指定范围搜索241
4.3.4搜索结果排序242
4.3.5索引缓存与更新243
4.4实现分类统计视图249
4.4.1单值列分类统计255
4.4.2侧钻256
4.5实现相似文档搜索257
4.6实现AJAX搜索联想词259
4.6.1估计查询词的文档频率259
4.6.2搜索联想词总体结构259
4.6.3服务器端处理260
4.6.4浏览器端处理265
4.6.5拼音提示267
4.6.6部署总结267
4.7推荐搜索词268
4.7.1挖掘相关搜索词268
4.7.2使用多线程计算相关
搜索词270
4.8查询意图理解271
4.8.1拼音搜索271
4.8.2无结果处理272
4.9集成其他功能272
4.9.1拼写检查272
4.9.2分类统计276
4.9.3相关搜索281
4.9.4再次查找284
4.9.5搜索日志284
4.10查询分析286
4.10.1历史搜索词记录286
4.10.2日志信息过滤286
4.10.3信息统计287
4.10.4挖掘日志信息289
4.10.5查询词意图分析290
4.11部署网站290
4.11.1部署到Web服务器290
4.11.2防止攻击292
4.12手机搜索界面295
4.13本章小结296

精彩书摘

  第2章自己动手写全文检索
  很多软件系统都需要对应的数据结构。信息检索中最常用的数据结构是倒排索引。全文索引如图2-1所示。
  图2-1以词为基础的全文索引
  倒排索引就是一个词到文档列表的映射。用HashMap实现的一个简单的倒排索引代码如下。
  publicclassInvertedIndex{
  Mapindex=
  newHashMap();//词和这个词在文档中出现的位置信息
  //索引文档
  publicvoidindexDoc(StringdocName,ArrayListwords){
  intpos=0;
  for(Stringword:words){
  pos++;//位置
  Listidx=index.get(word);
  if(idx==null){
  idx=newLinkedList();
  index.put(word,idx);
  }
  idx.add(newTuple(docName,pos));
  System.out.println("indexed"+docName+":"+pos+"words");
  }
  }
  //搜索
  publicvoidsearch(Listwords){
  for(Stringword:words){
  Setanswer=newHashSet();
  Listidx=index.get(word);
  if(idx!=null){
  for(Tuplet:idx){//找到了一些文档
  answer.add(t.docName);
  }
  }
  System.out.print(word);
  for(Stringf:answer){
  System.out.print(""+f);//输出文件名
  }
  System.out.println("");
  }
  }
  privateclassTuple{//元组
  privateStringdocName;//文档名
  privateintposition;//位置
  publicTuple(Stringd,intposition){
  this.docName=d;
  this.position=position;
  }
  }
  }
  如果用户的查询中包含多个词,需要统计这些词在文档中出现的区间大小。区间越小的文档相关度越高。
  publicclassSpan{
  publicintstart;//开始位置
  publicintend;//结束位置
  ……

前言/序言

  搜索引擎成为人们获取信息不可或缺的工具。大数据技术的发展推动了多机集群的分布式搜索引擎技术走向成熟。普通的机器就可以搭建分布式搜索引擎。一些开源的分布式搜索引擎系统在数据存储、数据分析等方面的功能越来越强大。《自己动手写分布式搜索引擎》希望用通俗易懂的语言,让任何对分布式搜索引擎技术感兴趣的读者都能够有所收获。
  《自己动手写分布式搜索引擎》的很多内容来源于搜索引擎、自然语言处理、金融等领域的项目开发和教学实践。在此感谢开源软件的开发者们,他们无私的工作丰富了《自己动手写分布式搜索引擎》的内容。
  《自己动手写分布式搜索引擎》的第1章介绍开发分布式搜索引擎所需要的基本算法;第2章介绍如何从头开始自己动手写一个简单的全文检索软件包;第3章介绍Lucene的基本使用方法及其原理;第4章介绍使用JSP或者Struts2开发搜索引擎用户界面,以及用户界面常用的Taglib;第5章介绍Solr实现分布式搜索引擎的解决方案——SolrCloud,以及它对SQL查询的支持;第6章介绍如何使用基于Lucene的ElasticSearch实现分布式搜索引擎。
  鉴于ElasticSearch处于快速发展中,一些新版本的具体使用情况可以加入QQ群460405445,进行讨论。
  《自己动手写分布式搜索引擎》配套的光盘中提供了相关的源代码,有的来源于猎兔搜索多年的开发经验积累,有的是经典算法实现。其中很多源代码都可以直接用于项目实践。
  《自己动手写分布式搜索引擎》适合需要具体实现搜索引擎的程序员使用,对于信息检索等相关领域的研究人员也有一定的参考价值,同时猎兔搜索技术团队已经开发出以《自己动手写分布式搜索引擎》为基础的专门培训课程和商业软件。目前的一些分布式搜索引擎软件仍然有很多功能有待完善,作者真诚地希望通过《自己动手写分布式搜索引擎》把读者带入分布式搜索引擎开发的大门并认识更多的朋友。
  感谢早期合著者、合作伙伴、员工、学员的支持,给我们提供了良好的工作基础。在将来,希望我们的分布式搜索引擎代码和技术能够像雨后春笋一样快速生长。
  《自己动手写分布式搜索引擎》由罗刚、崔智杰编著,另外参与《自己动手写分布式搜索引擎》编写的还有张晓斐、石天盈、张继红、张进威、刘宇、何淑琴、任通通、高丹丹、徐友峰、孙宽,在此一并表示感谢。
  编者


其他推荐