背景
关系数据库不适合做全文搜索
- like '%xxx%'效率很慢,建的索引将无效,查询的时候会像翻书一样一页一页的翻
- 返回的结果没有匹配度的概念,比如在所有文章里索引一篇想要的文章,可能是希望搜索的关键词在文章中出现的次数越多越是我想要的结果
- 当搜索live的时候,也想把lives/living搜出来,但是数据库很难做到
倒排算法
了解倒排算法之后方便理解为什么搜索引擎非常适合做全文搜索。简单来说倒排算法就是通过关键词快速定位到文章,首先记录了很多的关键词,关键词里记录了该关键词在哪些文章里出现了,当用户搜索的时候先找到关键词,然后计算出最相关的头几十篇文章返回给用户。
Lucene在国外知名度很高,现在已经是Apache的顶级项目,国内也有很多应用,它使用的就是倒排文件索引结构,算法结构如下:
(0)设有两篇文章1和2
文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too
文章2的内容为:He once lived in Shanghai.
(1)全文分析:由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
- a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间是连在一起的需要特殊的分词处理。
- b.文章中的”in”, “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉
- c.用户通常希望查“He”时能把含“he”,“HE”的文章也找出来,所以所有单词需要统一大小写。
- d.用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”
- e.文章中的标点符号通常不表示某种概念,也可以过滤掉
经过上面处理后
文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]
文章2的所有关键词为:[he] [live] [shanghai]
(2) 倒排索引:有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”对“拥有该关键词的所有文章号”。文章1,2经过倒排后变成
关键词 | 文章号 |
guangzhou | 1 |
he | 2 |
i | 1 |
live | 1,2 |
shanghai | 2 |
tom | 1 |
(3)通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:a)字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
关键词 | 文章号 | [出现频率] | 出现位置 |
guangzhou | 1 | [2] | 3,6 |
he | 2 | [1] | 1 |
i | 1 | [1] | 4 |
live | 1 | [2] | 2,5 |
| 2 | [1] | 2 |
shanghai | 2 | [1] | 3 |
tom | 1 | [1] | 1 |
(4) 以live 这行为例我们说明一下该结构:live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和出现频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中第 2个关键字。
以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元搜索算法快速定位关键词。
结语
参考:http://www.chedong.com/tech/lucene.html
参考的这篇文章里讲得更详细,网上也有很多介绍倒排算法的文章。既然已经有了,为什么我还要写这篇文章呢?我的考虑是倒排算法是搜索引擎的核心,理解了它能更好的理解搜索引擎的其他东西,也作为后续关于搜索引擎文章的完整性。
分享到:
相关推荐
《开发自己的搜索引擎——Lucene+Heritrix》是一本深入探讨如何构建自定义搜索引擎的书籍,结合了Apache Lucene和Heritrix两个强大的开源工具。Lucene是Java开发的全文检索库,而Heritrix则是一款功能丰富的网络爬虫...
Java搜索工具——Lucene实例总结(一) 在Java开发中,搜索引擎已经成为不可或缺的一部分,而Apache Lucene正是一个强大的全文搜索引擎库。这篇博文将带你深入理解Lucene的基本概念和使用方式,帮助你快速入门并掌握...
2. 索引构建:Lucene可以将分析后的文本构建为倒排索引,这是一种用于快速查找文档的数据结构。 3. 查询解析:用户输入的查询会被转换为可执行的搜索表达式,Lucene支持布尔运算符、短语查询、通配符查询等多种查询...
然后,Lucene对抓取的网页进行分析,提取关键词,并构建倒排索引,这是搜索引擎的关键部分,因为它允许我们根据关键词快速查找文档。 在构建索引的过程中,Lucene会执行以下步骤: 1. 分词(Tokenization):将文本...
总之,Lucene通过其独特的倒排索引机制实现了高效的全文搜索功能。通过对词条进行分词处理、构建词典和倒排列表,Lucene能够在海量数据中快速定位到相关的文档。同时,Lucene还提供了丰富的API接口和高度可定制化的...
通过高效的倒排索引机制,Lucene.Net能够快速地对大量文本数据进行查找,从而实现毫秒级的搜索响应时间。这种快速搜索能力得益于其内部的索引结构,包括词项(Term)、文档(Document)、段(Segment)等概念,以及...
Lucene是一个高性能、全文本检索库,它允许开发人员轻松地添加高级搜索功能到他们的项目中。下面,我们将详细讨论Lucene的一些核心概念和实战技巧。 1. **Lucene简介** Lucene是Java编写的一个开源全文检索库,由...
《解密搜索引擎技术实战——Lucene&Java精华版》是一本深入探讨搜索引擎技术的专业书籍,主要聚焦于开源全文搜索引擎库Lucene以及与之配合的Java编程语言。这本书旨在帮助读者理解搜索引擎的工作原理,并通过实际...
《Lucene搜索引擎开发权威经典》是一本深入探讨搜索引擎技术的专著,主要聚焦于开源的全文检索库——Apache Lucene。这本书是学习和理解搜索引擎工作原理以及如何利用Lucene进行开发的重要参考资料。Lucene是一个高...
1. **索引(Index)**:Lucene通过将文本数据转换为倒排索引,实现了快速的全文搜索。倒排索引将每个文档中的词项映射到包含这些词项的文档列表,从而大大加快了查询速度。 2. **Analyzer**:分析器负责将原始文本...
在本资料包中,重点是开源的全文检索库——Lucene。 **Lucene简介** Lucene是由Apache软件基金会开发的一个高性能、全文本搜索库,它提供了基础的索引和搜索功能,同时也支持高级搜索特性,如布尔运算、短语搜索、...
- **索引(Index)**:Lucene首先将文本数据转化为可搜索的结构——索引,类似于传统图书的目录,使搜索过程变得高效。 - **文档(Document)**:在Lucene中,每个待搜索的文件被视为一个文档,包含多个字段(Field...
首先,通过索引过程,Lucene将原始的文本数据转换为高效的存储结构——倒排索引。倒排索引是一种能够快速定位包含特定词的文档的数据结构。接着,查询解析器将用户的输入转换为可以与索引匹配的查询对象。最后,搜索...
《解密搜索引擎技术实战:Lucene in java(第2版)源码 dvd ppt》是一部深入探讨搜索引擎技术的著作,特别关注于使用Java实现的开源全文搜索引擎库——Lucene。本书结合了理论与实践,旨在帮助读者理解搜索引擎的...
《Lucene核心技术详解——以lucene-core-2.4.0.jar为例》 Apache Lucene是一个开源全文搜索引擎库,它为开发者提供了强大的文本搜索功能。本文将以“lucene-core-2.4.0.jar”这一特定版本为例,深入探讨Lucene的...
标题中的"lucene-3.5.0.jar"是Lucene的一个特定版本——3.5.0的Java档案文件(JAR),这个版本的发布标志着Lucene在全文搜索领域的又一里程碑。本文将深入探讨Lucene 3.5.0的核心特性和使用技巧。 首先,Lucene是一...
TCP应用编程 12篇学通csharp网络编程——第三篇 HTTP应用编程(下) 12篇学通csharp网络编程——第二篇 HTTP应用编程(上) 12篇学通csharp网络编程——第一篇 基础之进程线程 Lucene(1)lucene,你也会(7篇)——第...
2.2.0版本在当时已经具备了成熟的索引结构和搜索算法,包括倒排索引、TF-IDF权重计算等。通过分析源代码,我们可以了解到Lucene如何将文本数据转化为可以高效查询的索引结构,以及如何执行复杂的查询语句。 二、倒...
通过将文本转换为倒排索引,Lucene能够高效地找出包含特定关键词的文档。 2. **开源工具**:Lucene是一个开放源代码的项目,这意味着任何人都可以查看其源代码、学习它的实现原理,并根据自己的需求进行修改或扩展...