Lucene——Lucene初识
全文检索:先建立索引,再对索引进行搜索的过程就叫全文检索。Lucene是一套用于全文检索和搜寻的开源程序库,可以使用Lucene实现全文检索。Lucene是Apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,及部分文本分析引擎。Lucene官网Solr、Elasticsearch是两个基于Lucene开发的企业级的搜索引擎产品。...
一、前言
全文检索:先建立索引,再对索引进行搜索的过程就叫全文检索。
二、Lucene认识
Lucene是一套用于全文检索和搜寻的开源程序库,可以使用Lucene实现全文检索。Lucene是Apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,及部分文本分析引擎。Lucene官网
关键词:
1.文档Document:在索引前需要将原始内容创建成文档。每个文档都有文档id,是文档的唯一编号,可自动生成,编号不是域。
2.域Dield:相当于是文档的属性。域包括域名和域值。一个文档可以有多个域,不同文档可以有不同域,同一文档可以有相同域。
3.Term:每个单词叫做一个Term,不同的域中拆分出来的相同单词是不同的term。term中包含文档域名和单词的内容。Term将作为索引保存到索引库。
4.索引库:包括索引和文档对象。
5.倒排索引结构:根据内容(词语)找文档的索引结构。也叫反向索引结构,包括索引和文档两个部分,索引即词汇表,他的规模较小,而文档集合较大。
6.Field域的三个属性:
是否分析:是否对域的内容进行分词处理。前提是需要对域的内容进行查询。
是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可以搜索到。
是否存储:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取。
7.分析器:搜索时使用的分词器需要和索引时使用的分词器一致。Lucene自带分词器:标准分词器(StandardAnalyzer)、中日韩分词器(CJKAnalyzer)、中文分词器(SmartChineseAnalyzer);第三方分词器:paoding、mmseg4j、IK-analyzer(推荐使用,可扩展、可停止字典)、ansj_seg。
8.查询:MUST:必须满足and,SHOULD:应该满足or,MUST_NOT:必须不满足not。
9.范围查询:在lucene中支持数值类型,不支持字符串类型。但在solr中支持字符串类型。size:[1 TO 100]
三、Lucene应用
Solr、Elasticsearch是两个基于Lucene开发的企业级的搜索引擎产品。
ps:查看lucene索引库文件的工具:Luke
Lucene实现全文检索的流程
1.创建索引
获得原始文档
获取原始文档内容的目的是为了索引。
构建文档对象
在索引前需要将原始内容创建成文档,文档中包括多个域,域中存储内容。
分析文档(分词)
将域中的内容进行分析,分析过程是经过对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词等过程生成最终的语汇单元(一个个单词)。每个单词内容和域名组成一个Term,作为索引保存到索引库中。
创建索引
保存索引时,包括了 1.Term(域名Field和单词内容),2.该Term出现的次数,3.该Term在哪些文档doc中出现了的文档id
----创建索引的伪代码----
1.导入相关包(java):
lucene-core-4.10.3.jar、
lucene-analyzers-common-4.10.3.jar、
lucene-queryparser-4.10.3.jar、
commons-io-2.4.jar、
junit-4.9.jar
2.创建一个IndexWriter对象
1)指定索引库的存放位置Directory对象
2)指定一个分析器,对文档进行分析
Analyzer =new IKAnalyzer()
3.创建一个文档Document对象
4.创建域field对象,将Field添加到document对象中。
Field有四个子类:
StringField:字符串、不分析、要索引、可存储
LongField:Long类型、要分析、要索引、可存储
StoredField:多种类型、不分析、不索引、要存储
TextField:字符串或流、要分析、要索引、可存储
5.使用IndexWriter对象将Document对象写入索引库,此过程进行索引创建,
并将索引和Document对象写入索引库
6.关闭IndexWriter流对象
2.查询索引
查询接口
lucene不提供制作用户搜索界面的功能,需要根据自己的需求开发搜索界面。
创建查询
用户输入查询关键字执行搜索之前需要先构建一个查询对象,查询对象中可以指定查询要搜索的Field文档域、查询关键字等,查询对象会生成具体的查询语法。
执行查询
根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。
渲染结果
将查询结果展示给用户。提供了很多展示效果,比如搜索结果中关键词的高亮显示,百度提供的快照等。
----查询索引的伪代码----
1.创建Directory对象,即索引存放位置
2.创建一个IndexReader对象,需指定Directory对象
3.创建一个IndexSearcher对象,需指定IndexReader对象
4.创建一个Query对象,需指定查询的域和查询的关键词
查询的两种方式,
1)使用query的子类查询:
Query query1 = new TermQuery(new Term("field_name","java")) #精准查询
Query query2 = new MatchAllDocsQuery() #查询所有
Query query3 = NumericRangeQuery.newLongRange(...)#根据数值的范围查询
BooleanQuery query4 =new BooleanQuery(); query4.add(TermQuery,Occur.MUST);query4.add(TermQuery,Occur.MUST); #组合条件查询
2)使用queryparse解析查询(引入包lucene-queryparse-4.10.3.jar):
QueryParse queryParse1 =new QueryParse({"default_fieldName1","default_fieldName2"}, new IKAnalyzer()); #多个默认域查询
MultiFieldQueryParse queryParse2 =new MultiFieldQueryParsenew("default_fieldName", new IKAnalyzer()); #多个默认域查询
Query query5 =queryParse .parse("域:值") # "+域:值 -域:值"(+ - 空) ; "域:值 AND 域:值" (AND OR NOT)
5.执行查询,得到TopDocs对象
IndexSearcher四种搜索方法:
IndexSearcher.search(query,n)——根据Query搜索,返回评分最高的n条记录
IndexSearcher.search(query,filter,n)——添加过滤策略
IndexSearcher.search(query,n,sort)——添加排序策略
IndexSearcher.search(booleanQuery,filter,n,sort)——根据Query搜索(组合条件查询),添加过滤策略,添加排序策略,返回评分最高的n条记录
6.返回查询结果,遍历查询结果并输出
获得文档ID列表, ScoreDoc[] socreDocs =TopDocs.scoreDocs
for (sd :socreDocs ){
sd.doc #获得文档ID
Document =IndexSearcher.doc(doc) #根据ID获得文档
field_name = Document.get("field_name ") #根据域名称获得对应域内容
}
7.关闭IndexReader流对象
3.删除文档
----删除文档的伪代码----
1.创建一个IndexWriter对象
1)指定索引库的存放位置Directory对象
2)指定一个分析器,对文档进行分析
2.删除文档
IndexWriter.deleteAll() #删除全部
IndexWriter.deleteDocument(query) #根据条件删除
3.关IndexWriter流对象
4.更新文档
删除一个,新增一个就是修改。
----更新文档的伪代码----
1.创建一个IndexWriter对象
2.更新文档
data = Document
IndexWriter.updateDocument(Term_old,Iterable_data,IKAnalyzer())
3.关闭IndexWriter流对象
欢迎指正,随时修改~
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)