《lucene in action》笔记:构建索引

2019-03-10  本文已影响0人  Devops_cheers

1.lucene如何对搜索内容进行建模

1.1文档(document)和域(field)

文档是lucene索引和搜索的原子单位。文档为包含一个或多个域的容器,而域则依次包含真正的被搜索的内容。比如一篇文章就是一个文档,标题是一个域,标题内容为域值,正文也是一个域,正文内容为域值。lucene可以针对域进行三种操作:

2.理解索引过程

2.1提取文本和创建文档

使用lucene索引数据时,必须先从数据中提取纯文本格式信息,以便lucene识别该文本并建立对应的lucene文档。tika框架可以轻易的从各种格式的文件中提取文本信息

2.2分析文档

一旦建立起lucene文档和域,就可以调用IndexWriter对象的addDocument方法将数据传递给lucene进行索引操作了。在索引操作时,lucene首先分析文本,将文本数据分割成词汇单元,然后对它们执行一些可选操作。文本分析包含了词汇切割、大小写转换、移除停用词等操作。分析过程的步骤很重要,这一步会产生大量的词汇单元,随后这些词汇单元将被写入索引文件中。

2.3向索引添加文档

对文档分析完毕之后,就可以将分析结果写入索引文件了。lucene将输入数据以一种倒排索引的数据结构进行存储。lucene索引都包含一个或者多个段(segment),每个段都是一个独立的索引,它包含整个文档索引的一个子集。

3.基本索引操作

3.1向索引添加文档

添加文档的方法有两个:

3.2删除索引中的文档

IndexWriter提供了各种方法来从索引中删除文档

3.3更新索引中的文档

IndexWriter提供了两个简便的方法来更新索引中的文档

4.域选项

4.1域索引选项
4.2域存储选项
4.3域排序选项

如果需要按照某一域值对匹配的文档集合进行排序,那么该阈值应该被正确的索引以及存储。如果域是数值类型,在将它加入文档和进行排序时,要用NumericField类来表示

4.4多值域

文档的一个域可能有多个值,可以用document.add()多个域相同但域值不同的对象

5.对文档和域进行加权操作

5.1文档加权操作

调用加权操作的API只包含一个方法:documents.setBoost(float)

5.2域加权操作

使用field.setBoost(float)对域进行加权

5.3 加权基准

在索引期间,文档中域的所有加权都被合并成一个单一的浮点数。除了域,文档也有自己的加权值。这些权值被合并到一处,并被编码(量化)成一个单一的字节,作为域或文档信息的一部分存储起来。在搜索期间,被搜索域的norms都被加载到内存,并被解码还原为浮点数,然后用于计算相关性评分(relevance score)。
虽然norms是在索引期间首次进行计算的,后续还是可以使用IndexReader的setNorm方法对它进行修改的。

6.索引数字、日期和时间

6.1索引数字

使用NumricField可以对数字进行索引。每个数值都用特里结构(trie structure)进行索引,能实现高效的范围搜索或者过滤功能。

6.2索引日期和时间

同样使用NumricField索引时间。可以将时间转换成时间戳,在用NumricField

7.域截取

一些应用程序需要对尺寸未知的文档进行索引。IndexWriter允许对域进行截取后再索引它们。传入MaxFieldLength对象告知IndexWriter截取的长度。

8.近实时搜索

lucene通过调用IndexWriter中的对象方法实现近实时搜索:IndexReader getReader()。该方法能实时刷新缓冲区中新增或者删除的文档,然后创建新的包含这些文档的只读型IndexReader实例。

9.优化索引

lucene中索引的优化只是对段(segment)进行合并,这样可以提升搜索效率。思考下搜索功能需要访问各个段中的索引,减少了段的数量也就减少了扫描的次数。优化索引只能提高搜索速度而不是索引速度。IndexWriter提供了4个优化方法:

10.并发、线程安全及锁机制

10.1线程安全和多虚拟机安全
10.2索引锁机制

锁文件默认为write.lock,存在于索引目录内。

上一篇 下一篇

猜你喜欢

热点阅读