全文检索

一、简介
1、传统检索方式
两种接触到的检索方式
1.文件的检索和windows的检索
word文档的检索方式:
在文件打开时,将文件的所有内容加载到内存。
缺点:文件特别大时,无法加载。windows默认支持最大的加载文件的量是512M。
windows文件检索:
在窗口上检索当前磁盘上的文件名称:全盘搜索。
缺点:太慢了。
2.数据库
select利用like模糊查询。
缺点:效率低、不精确、不支持分词。
mysql单表数据量千万级。oracle单表数据量亿级。它们都有查询数据的临界点,当查询的数据量达到临界点时,查询时间集合成垂直上升,如下图所示:

总结:传统检索方式都不适合做海量数据的检索工作。
全文检索技术:
早期:海量数据搜索,然后存储到存储空间(数据库,大数据存储,hadoop),每一批海量数据都有对应的索引创建过程。
2000年,搜索引擎界出现搜索引擎工具包(框架级的开源包)的开源技术:lucene。
二、 Lucene
1、简介
lucene的创始人:Doug Cutting,开发了nutch和hadoop。
lucene本质就是一套API,创建索引的一个工具包。
搜索引擎:是为客户端提供全文检索功能的一个系统,例如:百度、谷歌等。
完成搜索引擎的开发,需要编写大量代码,其中包括网页文章的索引创建过程。早期没有lucene的时候,不同的搜索公司根据自己的索引创建逻辑和架构,完成海量网页存储后的数据索引创建;有了lucene后,开发人员无需编写底层代码,直接套用lucene索引框架创建技术,能够迅速编写出创建索引的过程。
lucene的索引创建,使用的是倒排索引,是专门为搜索引擎提供的索引创建算法。

2、倒排索引
比如:有如下两篇文章。
文章1: 马蓉负心王宝强,带着孩子跑到国外。
文章2: 王宝强面容憔悴,独身回家过年。
分词过程:
(马蓉,1,1),(负心,1,1),(王宝强,1,1),(王宝,1,1),(带着,1,1),(孩子,1,1)(王宝,2,1),(王宝强,2,1),(面容,2,1),(憔悴,2,1)
如果出现重复的分词,将会把文章的记录位置合并到一起,如下:
(马蓉,1,1),(负心,1,1),(王宝强,1,2,[1,1]),(王宝,1,2,[1,1]),(带着,1,1),(孩子,1,1),(面容,2,1),(憔悴,2,1)
搜索过程如下:
搜索关键字:马蓉–>文章1。
搜索关键字:王宝–>文章1,2。
以上这种过程叫做倒排索引的创建。
倒排索引的功能:
1 把文章(网页内容)进行分词,分词是最小意义的词语,作为当前意思不能再进行拆分。
2 标注了文件的位置(索引文件中,除了位置还可以保存其他内容)。
3 还可以标注出现次数。
4 对整体的索引文件创建之后,可以进行压缩处理(计算速度更快)。

传统索引都是先定位到一条整体的记录,在从中获取想要的数据;倒排索引是根据分词,定位到数据的记录位置。
在lucene中,分词和文章都是一个对象。

3、Lucene应用
1.Jar包
Lucene的使用,需要依赖jar包。测试过程使用4.10.2这个版本,这个版本可以用软件观察索引文件,最新版本暂时没有找到匹配的观察软件。
使用的jar包分别是lucene核心jar包、分词器、查询、中文分词器,四个jar包坐标如下:

org.apache.lucene
lucene-core
4.10.2


org.apache.lucene
lucene-analyzers-common
4.10.2


org.apache.lucene
lucene-queryparser
4.10.2

    <dependency>
        <groupId>org.wltea.analyzer</groupId>
        <artifactId>ik-analyzer</artifactId>
        <version>2012FF_u1</version>
    </dependency>

2.应用测试
1>创建工程
创建一个测试的maven工程search-test,导入jar包。
2>创建索引文件
创建索引的代码如下:
//创建索引文件;
//海量数据的索引文件创建过程需要读取源数据,测试过程手动拼接内容.创建一条索引
@Test
public void createIndex() throws Exception {
// 1.创建文件对象,对应数据库中某一个商品的记录,即一条数据库记录
Document doc = new Document();
// 应该从数据库将所有的数据进行导入,手动填充一个文件对象即可。
doc.add(new LongField(“id”, 536563L, Store.YES));
//数据类型要对应好,否则会有查询错误
//参数解析,id对应的是数据库字段的属性名称,536563L对应字段的值,Store.YES,当前的数据需要存到索引文件中
doc.add(new TextField(“title”, “阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待”, Store.YES));
doc.add(new TextField(“sellPoint”, “清仓!仅北京,武汉仓有货!”, Store.YES));
doc.add(new LongField(“price”, 299900L, Store.YES));
doc.add(new StringField(“image”, “http://image.jt.com/jd/4ef8861cf6854de9889f3db9b24dc371.jpg“, Store.YES));
//2 对应文件创建分词
//引入一个索引文件的保存位置
Directory dir = FSDirectory.open(new File(“index”));
//分词器对象,来进行数据的分词
// Analyzer analyzer=new StandardAnalyzer();
// Analyzer analyzer = new ChineseAnalyzer();
//引入第三方中文分词器,ik分词器
Analyzer analyzer = new IKAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer);
IndexWriter writer = new IndexWriter(dir, config);
//3 创建索引
writer.addDocument(doc);
writer.close();
dir.close();
}

3>根据索引搜索
根据索引搜索数据的代码如下:
// 根据索引查询数据
@Test
public void search() throws Exception {
//在索引中查询数据
Directory dir = FSDirectory.open(new File(“index”));
IndexSearcher searcher = new IndexSearcher(IndexReader.open(dir));
//创建搜索数据的条件
Query query = new TermQuery(new Term(“title”, “阿”));
//查询的分页内容配置
//查询title中具有阿尔卡特分词的doc结果.返回最多10条
TopDocs topDocs = searcher.search(query, 10);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
System.out.println(“得分:” + scoreDoc.score);
//doc文件中的内容打印
Document doc = searcher.doc(scoreDoc.doc);
System.out.println(doc.get(“id”));
System.out.println(doc.get(“title”));
System.out.println(doc.get(“sellPoint”));
}
dir.close();
}
4>测试
创建出来的索引文件存放到工程的index下,需要查看索引,检查是否成功。
索引的查看工具:lukeall-4.10.2,点击luke.bat运行即可,界面如下图:

当前索引文件概括内容,如下图:

id作为long的类型,也进行了分词,这个分词不是把数字字符串进行切割,而是逻辑计算。比如:范围分词和其他数字逻辑值。
title的分词结果:中文全部切割成单个字符。

4、数据对应关系
数据库中的商品信息,属于结构化数据,类型的对应需要一致。类型对应关系如下:
数据库 java lucene
varchar string stringfiled/textFiled
bigint long longField
int int intField
double double doubleField
StringFiled和TextFiled有什么区别?
StringFiled的分词不进行计算,直接使用原有数据的全部内容作为分词的单位。TextFiled的分词会根据分词器的逻辑,进行字符串的拆分,拆分成最小意义的分词。
document对象和索引的关系:
一个索引文件的整体包含多个document对象。
分词和索引的关系和document的关系:
一个分词对应索引中记录的多个document记录。
5、API
为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是Document、 Field、 IndexWriter、 Analyzer、Directory。下面我们分别介绍一下这五个类的用途:
1.Document
Document 是用来描述文档的,这里的文档可以指一个HTML页面,一封电子邮件,或者是一个文本文件。一个Document对象由多个Field对象组成的。可以把一个Document对象想象成数据库中的一个记录,而每个Field对象就是记录的一个字段。
2.Field
Field对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个Field对象分别描述。
3.Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由Analyzer来做的。Analyzer类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的Analyzer。Analyzer把分词后的内容交给IndexWriter来建立索引。
4.IndexWriter
IndexWriter是Lucene用来创建索引的一个核心的类,他的作用是把一个个的Document对象加到索引中来。
5.Directory
这个类代表了Lucene的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是RAMDirectory,它表示一个存储在内存当中的索引的位置。
熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,清单 1 给出了对某个目录下的文本文件建立索引的源代码。

三、Solr全文检索服务
1、介绍
solr基于lucene开发的一个搜索服务系统(web应用),底层依赖lucene。使用solr无需对doc进行封装和索引的创建,配置schema框架内容,可以对创建的doc的结构进行调整。例如:



solr可以自动查询对接数据库,将数据导入到doc中,从而创建对应源数据的索引文件。
2、 Solr安装
1.安装JDK
上传解压(基于java环境提前安装JDK),配置环境变量。
vim /etc/profile
source /etc/profile
2.下载solr
wget命令获取文件。

tar命令解压文件。

3.启动服务
首次启动solr解压内部war包。进入solr的bin目录。启动服务:
./solr start

启动后检查是否能够解压war启动web程序成功。
使用浏览器访问 ip:8983/solr。界面如下图:

4.创建项目管理目录
在solr-5.2.1/server/solr目录下创建jt项目的目录jt/conf和jt/data。

其中jt项目的配置文件存放到conf,jt项目的数据文件存放到data中,即索引文件。
目录结构solr/jt/conf solr/jt/data
5.配置文件
项目涉及的文件一共六个:3个xml配置文件,3个html展示文件。
将这6个文件全部放到项目管理目录conf中。
操作如下:
这里可以直接使用rz -E拖拽windows中的文件

1>Schema.xml
配置文件内容如下:

一个schema.xml文件对应一个doc的所有索引结构,这里定义一个xml对应商品的索引结构,红框内容是官方示例的基本结构,中间的是自定义拓展,最后几行是对类型的拓展,即中文分词器。
文本内容:

cp solr-dataimporthandler-* /home/software/solr-5.3.1/server/solr-webapp/webapp/WEB-INF/lib

7.添加自定义分词字典
在/solr-5.2.1/server/solr-webapp/webapp/WEB-INF目录下新建classes目录,来管理自定义内容,将IKAnalyzer.cfg.xml、ext.dic、stopword.dic传入。
三个文件分别是:自定义中文分词(如果使用默认可能未必最新,比如网络用语,专业名词都没有分词支持,需要自定义添加)、扩展字典、停止字典(例如禁止网络用语骂人的话)。
操作如下图:

8.重启solr
./solr stop –all #停止服务
./solr start #启动服务
./solr restart #重启服务

9.创建core
如下图创建Core Admin:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值