一、Lucene简介
1.1 什么是Lucene
Lucene是一个强大的全文搜索框架,并非拿来即用的应用产品,而是提供了实现如百度、谷歌桌面搜索等产品的工具。
1.2 Lucene能做什么
Lucene功能看似单一,实则潜力无限。它允许输入若干字符串,提供全文搜索服务,能精准定位关键词位置。利用Lucene,我们可以为站内新闻建立索引,打造专属资料库;索引数据库表字段,避免“%like%”导致的锁表问题;甚至开发个人搜索引擎。
1.3 你该不该选择Lucene
以下是一些测试数据供参考,若能接受,则可选择Lucene:
- 测试一:250万记录,约300M文本,生成约380M索引,800线程下平均处理时间300ms。
- 测试二:37000记录,索引数据库两个varchar字段,索引文件2.6M,800线程下平均处理时间1.5ms。
二、Lucene的工作方式
Lucene提供的服务包含写入和读出两部分。
2.1 写入流程
- 源字符串经analyzer处理,包括分词(将字符串分成单词)和去除stopword(可选操作)。
- 将源中必要信息加入Document的各个Field,按需索引和存储Field。
- 把索引写入存储器(内存或磁盘)。
2.2 读出流程
- 用户提供的搜索关键词经analyzer处理。
- 用处理后的关键词搜索索引,找到对应的Document。
- 用户根据需求从找到的Document中提取所需Field。
三、关键概念解读
3.1 Analyzer(分析器)
分析器将字符串按规则分词并去除无效词,如英文“of”、“the”,中文“的”、“地”等。其目的是按语义划分,英文因以单词为单位且空格分隔,分词较易;中文则需特定方法。例如,对于句子“我爱北京天安门”,分析器会将其分词,去除无效词后得到“我爱 北京 天安门”(假设的理想分词结果)。
3.2 Document(文档)
用户提供的源数据(如文本文件、字符串或数据库记录)经索引后以Document形式存储在索引文件中,搜索结果也以Document列表返回。比如一篇新闻文章,经Lucene处理后就是一个Document。
3.3 Field(字段)
一个Document可包含多个Field,如文章的“标题”“正文”“最后修改时间”等。Field有存储和索引两个属性,通过不同组合满足需求。以文章为例,若要对标题和正文全文搜索,需将它们的索引属性设为真;若希望直接从搜索结果提取标题,则标题域存储属性为真,正文域因太大可设为假,需要时再读取文件;仅提取最后修改时间则其存储属性为真,索引属性为假。
3.4 Term(词项)
Term是搜索最小单位,表示文档中的一个词语,由词语及其所在field组成。如在一篇关于旅游的文章中,“风景”这个词在正文中出现,那么“风景”和“正文”就构成一个Term。
3.5 Tocken(标记)
Tocken是Term的一次出现,包含term文本、起止偏移和类型字符串。同一句话中相同词语多次出现用同一Term表示,但不同位置用不同Tocken标记。例如“我爱北京天安门,天安门上太阳升”,“天安门”出现两次,是同一个Term,但两个位置分别有不同的Tocken。
3.6 Segment(段)
添加索引时,document先写入小文件(segment),再合并成大索引文件。比如有多个新闻文档,它们会先分别进入不同segment,然后合并。