基于lucene的站内新闻搜索引擎的设计与实现内容摘要:
接搜索引擎的新时代。 Lucene 简介 最初 Lucene 是 Apache 软件基金会 Jakarta 项目组 的 子项目,是一个完全开放源码的全文检索工具包。 Lucene的原作者是 Doug Cutting,他是一位资深全文检索专家, VTwin搜索引擎的主要开发者。 2020年 3月 Doug Cutting把 Lucene转移到 SourceFe上, 2020年 10月献给 Apache基金会。 Lucene的取名来自 Doug Cutting的妻子的名字。 Lucene在最初阶段是使用 java开发的。 然后逐渐被翻译成了多种语言,如 C++、 C、Perl等。 同时 Lucene的各种应用也开始发展起来,如 Nutch(一个 WebCrawler工具 )、 Hadoop(一个基于 Lucene的分布式计算平台)。 它们的出现为 Lucene带来了新鲜而且强大的动力。 目前 Lucene已经发展到了。 但是由于新版本刚刚发布,稳定性还不是很好, 基于 Lucene 的站内新闻搜索引擎的设计与实现 第 2 页 共 20 页 本文还是按照成熟的。 基于 Lucene 的站内新闻搜索引擎的设计与实现 第 3 页 共 20 页 第二章 索引的建立 概述 我们首先已经事先建立好了数据源,那么对于建立搜索引擎而言,第二步就是建立索引。 索引的目的在于建立一个用户目的信息,与数据源中一个单一数据的对应。 具体到文章来说就是需要找到用户所搜索的词与文章的关联。 索引的建立主要涉及一下几个问题,什么样的数据要建立索引。 以怎样的方式建立索引。 什么样的数据需要建立索引呢。 这就要分析用户需求了。 现阶段用户往往输入一段文字,然后希望找到与这段文字相关的信息。 这段文字可以拆分成一个个的字,也可以拆分成一个个的词。 无论字词,现在最后这都是我们获取的用户信息 ,我们要通过这个用户信息查找到相应的数据,那么字词便是需要建立索引的东西。 与用户有关的字词,往往出现在文章的标题和文章的正文中,这便是我们需要建立索引的域。 把这里边的内容拆成一个个的字词,这些字词就是我们要进行索引的数据。 而且用户需要搜索时间,我们就把时间整体索引,用户需要搜索什么,我们就把什么做索引。 怎样的方式去建立索引,决定了通过你的索引查找到相关文章的效率 ,索引的方式很多,我据一种简单的方式,而后结合 Lucene在详细的说明建立索引的方式。 一种最简单的建立索引的方式就是把字词和一篇文章中出现过这个字 词的文档的编号存在一起。 这样,当搜索到这个字词的时候,便能得到相应的文档编号,通过文档编号,便可以获取文档的全部信息。 索引的建立是开发搜索引擎的关键一步,他关系着你的搜索引擎的搜索效率。 相关的技术综述 倒排索引 倒排索引是 也常被称为 反向索引 、 置入档案 或 反向档案 ,是一种 索引 方法,被用来 存储 在 全文搜索 下某个单词在一个文档或者一组文档中的 存储位置 的 映射。 它是 文档检索系统 中最常用的 数据结构。 举一个例子: 文本 T0=“我爱中华人民共和国” 文本 T1=“我爱中国” 文本 T2=“中华人民共和国很伟大” 那么反向文件索引为: “我”: 0, 1 “爱”: 0, 1 “中华 人民共和国”: 0, 2 “中国”: 1 “很”: 2 “伟大”: 2 这样搜索“我”“中国”的结果就是 {0,1}∧ {1}={1} 基于 Lucene 的站内新闻搜索引擎的设计与实现 第 4 页 共 20 页 中文分词 中文分词是索引建立的关键。 因为中文博大精深,不像英语以空格完美分隔词。 同样的一句话在不同的语境下意思不同,同样连在一起两个字,在某些情况下它们是一个词,而有些情况下它们就是分别的字或者另一个词的组成部分。 例如我马上到,我从马上下来。 两个马上很难区分。 而且像“高高兴兴”这样的叠词,“去哪儿”这个儿化音词,“吃了顿饭”这种分离词都对使得分词变得极其困难。 现在变简单的介绍几种分词方式。 按字索引 按字分词可以解决所有的问题,使得搜索变的十分准确,因为字是汉字的最小单位,我们只要知道输入的是什么字,字与字之间的位置关系便可以确定整个搜索内容。 但是按字分词往往使得索引过大,并且用户往往都是直接输入连在一起的汉字,这样便使得,按字拆分的方法不能很好的猜测用户的意思。 中科院分词 中科院分词系统是目前使用很广泛的系统。 其最大的特点便是保留了大量的分词组合结果,对于每一个结果,通过公司进行计算其相关性,从而从多个分词结果中选出最合适的一个。 另一个特点便是他的人名,地名识别系统。 虽然在其开源版本上 不尽如人意,但是在其共享版的测试中效果还是非常好的。 他的缺点是分词数据并不是很快,而且开源版和共享版都有些问题。 优点是分词准确。 庖丁解牛 这个算法只有 Java 版本,其中的分词算法效率很高,和 JavaCC 中的词法分析算法有一些类似。 这个分词的缺点是有很多分词不准,优点是分词速度很快。 盘古分词 这个分词的思想便是匹配,但是其中对于多字的词,这个分词软件设置了很高的优先级,使得分词结果与我们实际想要的结果更加接近。 这个分词的优点是完全开源,结构清晰,方便在里边修改源代码,调整权重,并且有一套很好的词典 管理工具。 缺点就是其内置的词典太过混乱,需要人工修改,并且分词准确性不如中科院分词。 Lucene 标准分词 这个分词是按照 JavaCC实现的。 最后的结果是英文完美分词,中文按字拆分。 总的来说对英文应用来说是完美的分词。 但是对中文分词来说,效率上不够。 Lucene 索引的建立 Lucene 索引相关类介绍 (1) Document Lucene 中的逻辑文件,每一个或多个物理文件与一个逻辑文件相对应。 Document逻辑文件便是 Lucene中数据源。 (2) Field 代表 Document的属性。 一个 Document由多个 Field组成。 Field有是否索引,是否储存,是否分词之分。 (3) Term 词条,每个 Field中包含一个或多个词条。 (4) IndexWriter 写索引相关类 (5) IndexReader 基于 Lucene 的站内新闻搜索引擎的设计与实现 第 5 页 共 20 页 读索引相关类 Lucene 索引结构 (1) Segment 通常,一个 Segment 代表 Lucene 的一个完整索引段,一个索引中会包含多个Segment。 (2) .fnm 包含了 Document中所有 Field的名称。 (3) .fdt 用于储存 具有 Field数据。 (4) .fdx 用于储存 Document在 .fdt中的位置。 (5) .tis 用于储存分词后的词条。 (6) .tii 标明了每个 .tis文件中词条的位置。 (7) Deletable 储存了要删除的文档。 (8) .cfs 复合索引格式。 Lucene 索引过程 (1) 初始化 IndexWriter。 初始化分词器,设置好文件路径。 (2) 生成 Document。 把每个 Field添加到 Document,区分哪些是要保存的,哪些是要分词的,哪些是要索引的。 (3) 写索引。 把 Document信息写人缓存,然后生成 Segment、 .fnm、 .fdt、 .fdx、 .tis、 .tii、Deletable文件,最后合并为 Segment、 .cfs、 Deletable三个索引文件。 (4) 索引的合并与优化。 把多个 .cfs文件合并为一个,并删除无用信息。 Lucene 索引的合并与优化 索引的合并通过 mergeFactor、 maxMergeDocs、 minMergeDocs 因素控制,在批量建立索引时 mergeFactor去大值,在少量添加索引时 mergeFactor去小值。 索引的优化通过 IndexWriter的 Optimize方法实现。 把多个 Segment和 Deletable进行了合并。 Lucene 索引管理 Lucene的索引管理通过 IndexReader来实现,通过这个类,我们可以通过 ID找到相应的文档,通过 ID 删除文档,对删除的文档进行恢复等操作。 索引的建立还是通过IndexWriter。 索引的同步则依靠 和 来实现。 通过 IndexReader和 IndexWriter 这两个类 就 可以很好的管理索引。 在具体的项目中会介绍如何有效的管理索引。 基于 Lucene 的站内新闻搜索引擎的设计与实现 第 6 页 共 20 页 第三章 搜索 概述 搜索是建立一个搜索引擎的第三步,也是根据需求确定内核设计最烦琐的一步。 我们在建立搜索是不仅要考虑搜索的 数量和范围,更要定义相关的过滤器来过滤搜索结果,最后针对各种需求详细设计自己的搜索逻辑。 就目前而言,用户查看的往往只是搜索结果的前几条。 过多的搜索会造成不必要的时间浪费。 如何建立缓存使得用户快速查找,如何对最终结果进行估计,这些都显得格外重要。 搜索结果的过滤是非常必要的,搜索结果包含敏感词 ,用户给出需求想要限制搜索结果的范围,这些情况下都需要对搜索的结果进行过滤。 搜索逻辑是比较烦琐的一块,对于字词的正则表达式的分析,各种域的限制,使得这一块非常容易出错。 需要耐心的去修改,去完善。 Lucene 的搜索 Lucene 搜索相关类介绍 (1) IndexSearch 定义各种搜索的接口。 (2) Query 用于 查询的 Lucene字词类。 (3) Hits 储存搜索结果的类型。 (4) QueryParse 把字词生成查找对象。 Lucene 搜索过程 (1) 初始化 IndexSearch 选择相应的 Analysis分词器。 (2) 初始化 Query 通过 QueryParse把 字词转化成一个 Query。 然后把各种产生的 Query合并在一起。 (3) 定义 Filter 初始化 Filter,确定过滤的范围。 (4) 搜索 通过 IndexSearch的 Search方法,返回 Hits,得到结果。 Lucene 高级搜索 (1) TermQuery 这是最简单的一种 Query, 包括词条本身的内容和词条所在的 Field的信息。 通过使用 TermQuery,你可以进行最简单也是最原始的搜索。 (2) BooleanQuery 这是布尔搜索。 通过 BooleanQuery,我们可以实现与、或、非的逻辑操作。 基于 Lucene 的站内新闻搜索引擎的设计与实现 第 7 页 共 20 页 只需要在添加的时候指定这个值是必须出现,必须不出现还是应该出现。 (3) RangeQuery 这是范围搜索。 通过这个便可以搜索某个域中一定值范围的数据。 (4) PrefixQuery 这是前缀搜索。 通过这个便可以根据某种 前缀查找内容了。 (5) PhraseQuery 这是短语搜索。 通过这个便可以将短语作为一个整体进行搜索了。 (6) MultiPhraseQuery 这是多短语搜索。 通。基于lucene的站内新闻搜索引擎的设计与实现
相关推荐
a analysis and numerical calculation of the advanced technology and the interactive language environment. As a powerful scientific puting platforms, it almost to satisfy all puting requirements. As
(b) A3 (f) A4 (f) 1 1 Digital filter design Digital filter design of the basic requirements Digital filter design must go through three steps : (1) Identification of indicators : In the design of a
wx,cx, cy, angle) frontalmodel=rgb2gray(frontalmodel)。 model_rot = imresize(frontalmodel,[ly wx],39。 bilinear39。 )。 % 调整模板大小 model_rot = imrotate(model_rot,angle,39。 bilinear39。 )。 % 旋转模板 [l,r,u,d] =
, 到到 控控 制制 线线。 用用 LPC2124的的 个个 端端 口口 来来 控控 制制 键键 盘盘 进进 行行 扫扫 描描 , 来来 实实 现现 键键 盘盘 值值 的的 读读 取取 , 其其 中中 到到 送送 扫扫 描描 数数 据据 , 可可 以以 确确 定定 按按 下下 的的 键键 在在 矩矩 阵阵 键键 盘盘 中中 的的 行行 , 键键 盘盘 的的 值值 来来 确确 定定 按按 下下
e)。 } }//end get who add me as friend //处理上线结束 (Echo ing :+str)。 } (Close...)。 }catch(IOException e){}//捕或异常 finally {try{()。 } catch(IOException e){} } } } public class Server{//主服务器类 public static
请求,并对请求进行处理,将请求结果返回给客户机。 连接和无连接 网络中存在面向连接和无连接两种通信方式。 面向连接的通信方式要求通信双方(进程)必须先建立连接, 然后进行信息交互,通信结束后还须关闭连接。 该种通信方式可靠,适合大数据量传输(如因特网中的 TCP连接)。 无连接的通信方式不必先建立连接,而是直接进行通信,仅适合少量数据传输(如因特网中的 UDP 数据报)。 协议