lucene全文检索汇总
- 格式:ppt
- 大小:824.00 KB
- 文档页数:47
基于Lucene的异构数据库全文检索技术王亮;苏云【摘要】Recently the army has accumulated massive operationaldata,equipment performance,naval battlefield environment etc.These huge data is with various formats,and stored in different types of database.How to retrieve the target information from these data rapidly and exactly is a very important work.Lucene is a Java-based open source library of full text search,and can be easily used to customize a search engine which can meet the specific needs of users.In this paper,we develop a configurable full-text search engine which can support different types of database.%当前,我军积累了部队情况、装备性能、海战场环境等海量的作战数据.这些数据数量巨大、格式多样,且存储在不同类型的数据库中.如何快速准确地从这些数据中检索出目标信息,成为一项非常重要的工作.Lueene是一个基于Java的开源的全文检索库,利用它可以方便地定制出符合用户特定需求的搜索引擎.使用Lueene可研制出一种可配置的、支持不同类型数据库的全文搜索引擎.【期刊名称】《指挥控制与仿真》【年(卷),期】2017(039)002【总页数】5页(P141-144,148)【关键词】Lucene;异构数据库;全文检索;搜索引擎;索引【作者】王亮;苏云【作者单位】海军指挥所,北京100841;江苏自动化研究所,江苏连云港222061【正文语种】中文【中图分类】TP391.3;E91随着现代互联网的快速发展,网络上存储的信息量越来越大且呈指数增长。
全文分两部分:一:Lucene简介Lucene版本:3.0.2全文检索大体分两个部分:索引创建(Indexing)和搜索索引(Search)1. 索引过程:1) 有一系列被索引文件(此处所指即数据库数据)2) 被索引文件经过语法分析和语言处理形成一系列词(Term)。
3) 经过索引创建形成词典和反向索引表。
4) 通过索引存储将索引写入硬盘。
2. 搜索过程:a) 用户输入查询语句。
b) 对查询语句经过语法分析和语言分析得到一系列词(Term)。
c) 通过语法分析得到一个查询树。
d) 通过索引存储将索引读入到内存。
e) 利用查询树搜索索引,从而得到每个词(Term)的文档链表,对文档链表进行交,差,并得到结果文档。
f) 将搜索到的结果文档对查询的相关性进行排序。
g) 返回查询结果给用户。
• 索引过程如下:◦创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。
◦创建一个Document代表我们要索引的文档。
◦将不同的Field加入到文档中。
我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。
不同类型的信息用不同的Field来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。
其中FileReader的SRC_FILE就表示要索引的源文件。
◦IndexWriter调用函数addDocument将索引写到索引文件夹中。
• 搜索过程如下:◦IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。
◦创建IndexSearcher准备进行搜索。
◦创建Analyer用来对查询语句进行词法分析和语言处理。
◦创建QueryParser用来对查询语句进行语法分析。
◦QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。
lucene全文检索精华lucene全文检索1 概念全文检索(Full-Text Retrieval)是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。
当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程.1.1 lucene全文检索的特性全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本。
全面、准确和快速是衡量全文检索系统的关键指标。
关于全文检索的特性,我们要知道:1,只处理文本。
2,不处理语义。
3,搜索时英文不区分大小写。
4,结果列表有相关度排序。
下图就是显示“1+1等于几”这个搜索要求对应的结果。
可以看到,是没有“2”这个结果的,结果页面都是出现了这些词的网页 .1.2 全文检索的应用场景我们使用Lucene,主要是做站内搜索,即对一个系统内的资源进行搜索。
如BBS、BLOG中的文章搜索,网上商店中的商品搜索等。
使用Lucene的项目有Eclipse、Jira等。
一般不做互联网中资源的搜索,因为不易获取与管理海量资源(专业搜索方向的公司除外)。
2 第一个lunece程序2.1 准备lucene的开发环境搭建Lucene的开发环境只需要加入Lucene的Jar包,要加入的jar包至少要有: ? lucene-core-4.4.0.jar(核心包)? analysis\\common\\lucene-analyzers-common-4.4.0.jar(分词器) ?highlighter\\lucene-highlighter-4.4.0.jar(高亮) ? \\memory\\lucene-memory-4.4.0.jar(高亮)? queryparser\\ lucene-queryparser-4.4.0.jar (查询解析)2.2 实现建立索引功能(IndexWriter)/*** 使用indexWriter对数据库建立索引.. * @throws IOException */ @Test public void createIndex() throws IOException{//索引存放的位置...Directory directory=FSDirectory.open(new File(\));//lucene当前使用的匹配版本Version matchVersion=Version.LUCENE_44;//分词器,对文本进行分词,抽象类,由子类实现不同的分词方式Analyzer analyzer=new StandardAnalyzer(matchVersion); //索引写入的配置 IndexWriterConfig indexWriterConfig=new//构建用于操作索引的类IndexWriter indexWriter=new IndexWriter(directory,IndexWriterConfig(matchVersion, analyzer);indexWriterConfig);//索引库里面的要遵守一定的结构,(索引结构...) 在索引库当中保存的都是documentDocument doc=new Document(); //索引document里面页游很多的字段... /** * 1:字段的名称 * 2:字段对应的值* 3:该字段在索引库中是否存储 */IndexableField id=new IntField(\, 1, Store.YES);//StringField不会根据分词器去拆分,只有后面的String全包括才能被搜索到IndexableField title=new StringField(\, \培训,传智播客//TextField如果按照默认分词器去拆分,中文则是按照单个中文拆分的专注Java培训10年\, Store.YES);IndexableField content=new TextField(\, \培训的龙头老大,口碑最好的java培训机构,进来看看同学们的呐喊\, Store.YES);doc.add(id);}doc.add(title); doc.add(content);indexWriter.addDocument(doc);indexWriter.close();2.3 实现搜索功能(IndexSearcher)/*** 使用indexSearcher对数据进行搜索 * @throws IOException */ @Testpublic void queryIndex() throws IOException{//索引存放的位置Directory directory=FSDirectory.open(new File(\)); //创建索引读取器IndexReader indexReader=DirectoryReader.open(directory);//通过indexSearcher去检索索引目录...IndexSearcher indexSearcher=new IndexSearcher(indexReader);//我们以后只要根据索引查找,整个过程肯定要分2次..//这是一个搜索条件..,通过定义条件来进行查找...(可以拿到编号,编号都放在了//term 我需要根据哪个字段进行检索,字段对应的值...//Query是抽象类,由子类去实现不同的查询规则Query query=new TermQuery(new Term(\, \));//搜索先搜索索引目录(第一次搜)..不会直接搜索到document(第二次搜) //找到符合query条件的前面N条记录...如果不加条件则会全部查询出来ScoreDoc数组中,遍历数组就获得了编号)TopDocs topDocs=indexSearcher.search(query, 10); System.out.println(\总记录数是:\+topDocs.totalHits);//返回结果的数组(得分文档)ScoreDoc[] scoreDocs=topDocs.scoreDocs; //返回一个击中..for(ScoreDoc scoreDoc:scoreDocs){int docID=scoreDoc.doc; //根据编号去击中对应的文档//lucene的索引库里有很多document,lucene为每个document定义一个编号,唯一标识(docId),是自增长的。
1.多字段搜索使用multifieldqueryparser可以指定多个搜索字段。
query query = multifieldqueryparser.parse(”name*”, new string[] { fieldname, fieldvalue }, analyzer);indexreader reader = indexreader.open(directory);indexsearcher searcher = new indexsearcher(reader);hits hits = searcher.search(query);2.多条件搜索除了使用queryparser.parse分解复杂的搜索语法外,还可以通过组合多个query来达到目的。
query query1 = new termquery(new term(fieldvalue,“name1′)); //词语搜索query query2 = new wildcardquery(new term(fieldname,“name*”)); //通配符//query query3 = new prefixquery(new term(fieldname,“name1′)); //字段搜索field:keyword,自动在结尾添加*//query query4 = new rangequery(new term(fieldnumber, numbertools.longtostring(11l)), new term(fieldnumber, numbertools.longtostring(13l)), true); //范围搜索//query query5 = new filteredquery(query, filter); //带过滤条件的搜索booleanquery query = new booleanquery();query.add(query1, booleanclause.occur.must);query.add(query2, booleanclause.occur.must);indexsearcher searcher = new indexsearcher(reader);hits hits = searcher.search(query);3.过滤使用filter对搜索结果进行过滤,可以获得更小范围内更精确的结果。
基于Lucene的电子文献全文检索系统的研究【摘要】:实现了中文单字切分模块,并在LuceneAPI基础上建立支持中英文混合检索的全文数据库。
在电子文献全文检索系统项目中作为全文检索工具。
中文全文数据库的主要性能和功能包括:支持中英文混合检索;可以不关机动态添加或删除一篇文档索引;采用多线程设计,能承受大量的访问请求;支持跨平台运行;提供命令行直接查询方式和基于WEB的查询方式;易学通用的检索表达式;系统可扩展性强。
【关键词】:中文信息处理;全文数据库;全文检索Lucene中国分类号:TP3 文献标识码:A 文章编号:1002-6908(2007)0220078-011.Lucene简介Lucene是一个信息检索的函数库(Library),利用它你可以为你的应用加上索引和搜索的功能。
Lucene的使用者不需要深入了解有关全文检索的知识,仅仅学会使用库中的一个类,你就为你的应用实现全文检索的功能。
Lucene可以对任何的数据做索引和搜索,不管是MS word、Html 、pdf还是其他什么形式的文件只要你可以从中抽取出文字形式的内容就可以被Lucene所用,你就可以用Lucene对它们进行索引以及搜索。
它不仅能用来构建具体的全文检索应用,而且可被集成到各种系统软件中构建Web 等多种应用。
例如,某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。
2.Lucene检索原理Lucene的检索算法属于索引检索,即用空间来换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键词。
在使用数据库的项目中,一般不使用数据库进行检索,其主要原因是数据库在非精确查询的时候使用查询语言”like%keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行”%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是低效的,它需要对所有的记录进行匹配查询。
用lucene实现在一个(或者多个)字段中查找多个关键字最近跟着师兄们做个项目,我的任务就是负责做个“全文检索”的小模块。
用到了Lucene 的索引,下面的是其中的用Lucene实现在索引的一个字段(比如文章内容字段)进行查找多个关键字的实例代码。
1.Lucene说明Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。
Lucene的的强项在“建立索引”和”搜索“,而不是实现具体的”分词“。
Lucene支持对生成索引的进行”增,删,改,查“操作,这比自己建立的索引有了很大的进步。
可以使用专门的分词程序进行分词,在分词的结果上用Lucene建立索引。
2.用Lucene实现在一个或者多个字段中的检索主要是函数:MultiFieldQueryParser.parse(String[] query,String[] field,Occur[] occ,Analyzer analyzer);1)query:要查找的字符串数组2)field:要查找的字符串数组对应的字段(当然有可以相同的)3)occ:表示对应字段的限制。
有三种:Occur.MUST(必须有),Occur.MUST_NOT(必须没有),Occur.SHOULD(应该)4)analyzer:对查询数据的分析器,最好与建立索引时用的分析器一致3.代码示例下面这个程序可以实现在一个字段“contents”中查找多个关键字。
稍加修改也可以在多个字段查找多个关键字。
import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.queryParser.MultiFieldQueryParser;import org.apache.lucene.search.BooleanClause.Occur;import org.apache.lucene.search.Hits;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;public class MultiPhraseQuerySearcher {private static String indexPath = "E:\\Lucene\\index"; //索引保存目录public static void createIndex(){ //建立索引IndexWriter writer;try {writer = new IndexWriter(indexPath,new StandardAnalyzer(),true);Field fieldB1 = new Field("contents","今晚的辩题很道地:在我们这些人当中?",Field.Store.YES,Field.Index.TOKENIZED);Field fieldB2 = new Field("contents","我们为电影《今朝》是一部不错的影片。
Lucene是一套全文检索的API,对其介绍的文章和应用的案例都多,可参考lucene及本文的参考文献。
此次学习,以实用为主,一是简单应用,二是Web应用,三是汉化,四相关应用(Lucene主页上在SandBox中)。
0、准备工作去Lucene的主页下载目前的稳定版本lucene-1.2.tar.gz,解压缩,将lucene-1.2目录下的两个jar文件lucene-1.2.jar和lucene-demo2-1.2.jar放到适当的目录下后,并将其加入到CLASSPATH环境变量中。
tar zxvf lucene-1.2.tar.gz <----解压缩cd lucene-1.2cp *.jar $DP<---存放jar文件的目录,根据具体工作要求用实际目录替换CLASSPATH=$CLASSPATH:$DP/lucene-1.2.jar:$DP/lucene-demos-1.2.jar; export CLASSPATH如果不想在每次都登录后,可以编辑/etc/profile或自己目录下的.profile,将上面的最后一行加到文件的最后一行。
Windows的设置,右击桌面的“我的电脑”,选“高级”->“环境变量”->选中CLASSPATH->“编辑”,在输入框中加入两个jar文件的全路径名,注意分隔符是分号(;)。
参见右图。
1、运行demo$ java org.apache.lucene.demo.IndexFiles /usr/local/man/man1/ <--对man 文件建立索引adding /usr/local/man/man1/mysql.1...........adding /usr/local/man/man1/cvs.11614 total milliseconds$ java org.apache.lucene.demo.SearchFiles <--进行检索Query: passwordSearching for: password7 total matching documents0. /usr/local/man/man1/mysql.1......6. /usr/local/man/man1/mysqlshow.1Query:OK!Lucene自待的demo运行成功这个demo程序调用的主要API函数:/*关于索引的主要函数*/File file=new File(argv[]);IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), true);Document doc = new Document();doc.add(Field.Text("path", file.getPath()));doc.add(Field.Keyword("modified",DateField.timeToString(stModi fied())));FileInputStream is = new FileInputStream(f);Reader reader = new BufferedReader(new InputStreamReader(is));doc.add(Field.Text("contents", reader));writer.addDocument(doc);writer.optimize();writer.close();/*关于检索的主要函数*/Searcher searcher = new IndexSearcher("index");Analyzer analyzer = new StandardAnalyzer();Query query = QueryParser.parse(lineforsearch, "contents", analyzer); Hits hits = searcher.search(query);for (int i = start; i < hits.length(); i++) {Document doc = hits.doc(i);String path = doc.get("path");System.out.println(i + ". " + path);}3、运行LuceneWeb假定tomcat装在$TOMCATHOME目录下,具体应用时用真实的目录替换$TOMCATHOME。
使用Apache Lucene进行全文检索和信息检索随着数据量的日益增长,信息的获取和管理也变得越来越困难。
在这样的背景下,全文检索技术备受关注。
全文检索是指通过对文本内容进行扫描和分析,快速地查找出包含指定关键字或短语的文本,以满足用户的需求。
Apache Lucene是一款强大的全文检索引擎,具有高效、可靠、易于扩展等特点,广泛被运用于信息检索、文本分类、数据挖掘等领域。
一、Lucene的基本原理Lucene是一款基于Java语言的全文检索引擎,能够快速地在海量数据中查找指定的文本。
Lucene的检索原理可以简单地描述为:将需要检索的文本输入Lucene,Lucene建立索引文件,用户查询文本时,Lucene在索引文件中查找匹配结果,返回用户所需的信息。
Lucene的基本原理如下:1. 建立索引建立索引是Lucene进行全文检索的第一步。
在索引过程中,Lucene会对文本进行解析、分词、词语过滤等处理,然后将这些处理后的词语和其所在的文档信息存储到索引文件中。
通过如此的操作,Lucene做到了在指定时间内,快速地查找指定文本。
2. 查询当用户输入需要检索的文本时,Lucene会对该文本进行同样的预处理,得到其中的每个单独词语,并在索引文件中查找与该词语相匹配的文档。
Lucene采用了先搜索后排名的检索策略,即先找到与关键词匹配的文档,然后再通过算法对得到的结果进行排序,得出匹配度最高的文档。
3. 返回结果Lucene的返回结果是一个文档对象,其中包含了原始文本、关键词匹配的位置和得分等信息。
在大多数情况下,返回的文档对象并不是用户真正想要的结果,需要进行二次过滤和排序,才能得出目标结果。
二、Lucene的基本使用Lucene的使用可以简单地分为以下几个步骤:1. 创建索引创建索引是Lucene进行全文检索的第一步,也是最重要的一步。
在创建索引前,需要准备好需要检索的文本文件。
Lucene支持的文本格式包括txt、doc、pdf等。