`
673181695
  • 浏览: 3871 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

全文搜索Lucene——之倒排算法

阅读更多
背景

  关系数据库不适合做全文搜索
  • 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的全文检索中的应用

    本文构造出一种适应中英文信息处理的Lucene语言分析器,该分析器的核心模块——分词器所使用的分词算法是一种基于词典的中文分词算法,该算法具体实现上采用了基于词前缀哈希技术来进行逐字匹配,采用基于规则统计...

    数据结构算法

    TCP应用编程 12篇学通csharp网络编程——第三篇 HTTP应用编程(下) 12篇学通csharp网络编程——第二篇 HTTP应用编程(上) 12篇学通csharp网络编程——第一篇 基础之进程线程 Lucene(1)lucene,你也会(7篇)——第...

    Lucene中文分词组件 JE-Analysis 1.5.1

    全面支持Lucene 2.0 增强了词典维护的API 增加了商品编码的匹配 增加了Mail地址的匹配 实现了词尾消歧算法第二层的过滤 整理优化了词库 1.4.0 —— 2006-08-21 增加词典的动态扩展能力 1.3.3 ...

    基于Java的全文索引引擎Lucene

    基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史全文检索的实现:Luene全文索引和数据库索引的比较中文切分词机制简介:基于词库和自动切分词算法的比较具体的安装和使用简介:系统结构介绍和演示...

    Lucene中文分词组件 JE-Analysis 1.4.0

    分词效率: 第一次分词需要1-2秒(读取词典),之后速度基本与Lucene自带分词持平 运行环境: Lucene 1.9+ 内存消耗: 30M+ 1.4.0 —— 2006-08-21 增加词典的动态扩展能力 1.3.3 —— 2006-07...

    Lucene IndexApplication:使用lucene索引文本文档-开源

    Lucene 功能:- 强大、准确且高效的搜索算法。 许多强大的查询类型:短语查询、通配符查询、邻近查询、范围查询等。 按任何字段进行日期范围搜索和排序。 增量索引与批量索引一样快。 Quartz.NET 引擎,用于搜索...

    知识库详细设计说明书1

    知 识 库 管 理 系 统 ——软件详细设计说明书目 录 第1章 关键技术 1 1.1 Lucene检索 1 1.1.1 核心技术 1 1.1.2 Lucene

    Hadoop基础培训教程.pdf

    起源与目标 大数据与Hadoop 应用模式 Hadoop的前世今生 Hadoop最早作为Nutch的一个模块被引入,Nutch又是Lucene的一个子 项目 Lucene是Apache下的一个全文索引引擎 Nutch是一个完整的搜索引擎,它以Lucene为核心 ...

    Jive资料集

    13 Jive3.0.8 MYSQL的中文解决方案 14 jive_kb_i18n_zh_CN_ori.properties <br><br> <br> <br>全文搜索 1 使您的Jive搜索支持中文 2 关于Jive2中的中文搜索 3 基于JAVA的全文索引引擎Lucene简介 ...

    jive.chm

    2 关于Jive2中的中文搜索 3 基于JAVA的全文索引引擎Lucene简介 <br> 安全认证 1 Jive2.1.1 License保护原理分析 2 用Java的加密机制来保护你的数据 3 在java中编程实现数字签名系统...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目源代码

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

Global site tag (gtag.js) - Google Analytics