全文检索引擎Apache Lucene词汇表和架构
Posted 曼路程序人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全文检索引擎Apache Lucene词汇表和架构相关的知识,希望对你有一定的参考价值。
1)基本词汇:
文档 (document):索引和搜索时使用的主要数据载体,包含一个或多个存有数据的字段。 可以看成相当于RDBMS的表记录(record)
字段 (field):文档的一部分,包含名称和值两部分。 可以相当于RDBMS的列(column)
词 (term):一个搜索单元,表示文本中的一个词。
标记 (token):表示在字段文本中出现的词,由这个词的文本、开始和结束偏移量以及类型组成。
Apach Lucene将所有信息写到一个倒排索引(inverted index)的数据结构中,其中的数据是面向词而不是面向文档的,倒排索引建立了索引中词和文档之间的映射。
举个例子,有以下三篇文档的标题字段需要被索引:
Elasticsearch Server 1.0 (document 1);
Mastering Elasticsearch (document 2);
Apache Solr 4 Cookbook (document 3)。
那么简化版的索引可以看成是这样的:
词 |
计数 |
文档 |
1.0 |
1 |
1> 1> |
4 |
1 |
3> 3> |
Apache |
1 |
3> 3> |
Cookbook |
1 |
3> 3> |
Elasticsearch |
2 |
1>,2> 2>1> |
Mastering |
1 |
2> 2> |
Server |
1 |
1> 1> |
Solr |
1 |
3> 3> |
每一个词指向包含它的文档编号。这样就可以执行一种非常高效且快速的搜索,比如基于词的查询。此外,每个词有一个计数,告诉Lucene该词出现的频率。实际Lucene创建的索引要比这个复杂及先进许多,创建的额外文件包含了词向量(term vector),文档值(doc value)等信息。
每个索引分为多个“写一次,读多次”(write once and read many time)的段(segment)。多个段可以通过段合并 (segments merge)合并在一起。当强制段合并或者Lucene决定合并时,这些小段就会由Lucene合并成更大的一些段。合并需要I/O。在合并时,不再需要的信息将被删除(例如,被删除的文档)。除此之外,检索大段比检索存有相同数据的多个小段速度更快。
2)输入数据分析:
传入的文档中的数据怎样转化成倒排索引,查询文本怎样变成可被搜索的词?这个数据转化过程被称为分析(analyze)。分析的工作由分析器(analyzer) 完成,它由一个 分词器 (tokenizer)和零个或多个标记过滤器(token filter)组成,也可以有零个或多个字符映射器(character mapper)。
Lucene中的分词器把文本分割成多个标记,基本就是词加上一些额外信息,比如该词在原始文本中的位置和长度。分词器的处理结果称为 标记流 (token stream),它是一个接一个的标记,准备被过滤器处理。以下是一些过滤器例子。
小写过滤器(lowercase filter):把所有的标记变成小写。
同义词过滤器(synonyms filter):基于基本的同义词规则,把一个标记换成另一个同义的标记。
多语言词干提取过滤器(multiple language stemming filter):减少标记(实际上是标记中的文本部分),得到词根或者基本形式,即词干。
建立索引时,Lucene会使用你选择的分析器来处理你的文档内容。不同的字段可以使用不同的分析器,也可以不分析字段。
查询时,查询将被分析。但是,也可以选择不分析。记住这一点很关键,因为一些Elasticsearch查询被分析,一些则不然。例如,前缀和词查询不被分析,匹配查询则被分析。可以在被分析查询和不被分析查询两者中选择非常有用。有时,可能希望查询一个未经分析的字段,而有时则希望有全文搜索的分析。如果我们查询LightRed这个词,标准分析器分析这个查询后,会去查询light和red;如果我们使用不经分析的查询类型,则会明确地查询LightRed这个词。索引应该和查询词匹配。如果它们不匹配,Lucene不会返回所需文档。
3)评分(scoring)和查询相关性:
得分是根据文档和查询的匹配度使用计分公式计算的结果。默认情况下,Apache Lucene使用TF/IDF(term frequency/inverse document frequency,词频/逆向文档频率)评分机制,这是一种计算文档在我们查询上下文中相关度的算法。当然,它不是唯一可用的算法。Elasticsearch和Lucene计算的分数值越高,意味着文档越相关。一些参数(比如boost)、不同的查询类型、不同的评分算法,都会影响得分的计算。
引用:Marek Rogoziński; Rafał Kuć. Elasticsearch服务器开发(第2版)人民邮电出版社.
以上是关于全文检索引擎Apache Lucene词汇表和架构的主要内容,如果未能解决你的问题,请参考以下文章
搜索引擎系列二:Lucene(Lucene介绍Lucene架构Lucene集成)