3.2 Lucene的使用.md

首先,帮忙点击一下我的网站http://www.wenzhihuai.com/arrow-up-right 。谢谢啊,如果可以,GitHub上麻烦给个star,以后面试能讲讲这个项目,GitHub地址https://github.com/Zephery/newblogarrow-up-right

Lucene的整体架构

image

搜索引擎的几个重要概念:

  1. 倒排索引:将文档中的词作为关键字,建立词与文档的映射关系,通过对倒排索引的检索,可以根据词快速获取包含这个词的文档列表。倒排索引一般需要对句子做去除停用词。

  2. 停用词:在一段句子中,去掉之后对句子的表达意向没有印象的词语,如“非常”、“如果”,中文中主要包括冠词,副词等。

  3. 排序:搜索引擎在对一个关键词进行搜索时,可能会命中许多文档,这个时候,搜索引擎就需要快速的查找的用户所需要的文档,因此,相关度大的结果需要进行排序,这个设计到搜索引擎的相关度算法。

Lucene中的几个概念

  1. 文档(Document):文档是一系列域的组合,文档的域则代表一系列域文档相关的内容。

  2. 域(Field):每个文档可以包含一个或者多个不同名称的域。

  3. 词(Term):Term是搜索的基本单元,与Field相对应,包含了搜索的域的名称和关键词。

  4. 查询(Query):一系列Term的条件组合,成为TermQuery,但也有可能是短语查询等。

  5. 分词器(Analyzer):主要是用来做分词以及去除停用词的处理。

索引的建立

索引的搜索

lucene在本网站的使用:

  1. 搜索 2. 自动分词

一、搜索

注意:本文使用最新的lucene,版本6.6.0。lucene的版本更新很快,每跨越一次大版本,使用方式就不一样。首先需要导入lucene所使用的包。使用maven:

  1. 构建索引

  1. 更新与删除

  1. 查询

  1. 高亮

结果

  1. 分页 目前lucene分页的方式主要有两种: (1). 每次都全部查询,然后通过截取获得所需要的记录。由于采用了分词与倒排索引,所有速度是足够快的,但是在数据量过大的时候,占用内存过大,容易造成内存溢出 (2). 使用searchAfter把数据保存在缓存里面,然后再去取。这种方式对大量的数据友好,但是当数据量比较小的时候,速度会相对慢。 lucene中使用searchafter来筛选顺序

  1. 使用效果 全部代码放在这里arrow-up-right,代码写的不太好,光从代码规范上就不咋地。在网页上的使用效果如下:

二、lucene自动补全

百度、谷歌等在输入文字的时候会弹出补全框,如下图:

在搭建lucene自动补全的时候,也有考虑过使用SQL语句中使用like来进行,主要还是like对数据库压力会大,而且相关度没有lucene的高。主要使用了官方suggest库以及autocompelte.jsarrow-up-right这个插件。 suggest的原理看这arrow-up-right,以及索引结构看这arrow-up-right

使用:

  1. 导入maven包

  1. 如果想将结果反序列化,声明实体类的时候要加上:

  1. 实现InputIterator接口

  1. ajax 建立索引

  1. 查找 因为有些文章的标题是一样的,先对list排序,将标题短的放前面,长的放后面,然后使用LinkHashSet来存储。

  1. controller层

  1. ajax来提交请求 autocomplete.js源代码与介绍:https://github.com/xdan/autocomplete

  1. 效果:

欢迎访问我的个人网站arrow-up-right

参考: https://www.ibm.com/developerworks/cn/java/j-lo-lucene1/

http://iamyida.iteye.com/blog/2205114

最后更新于