lucene_入门整理
- 格式:doc
- 大小:151.50 KB
- 文档页数:21
lucene 基本概念Lucene 基本概念Lucene 是一个开源的全文搜索引擎库,被广泛地应用于高性能搜索和索引任务中。
它是 Apache 软件基金会的一个开源项目,并且被许多知名的商业产品使用。
本文将通过一步一步的方式,来介绍 Lucene 的基本概念和其原理。
一、Lucene 是什么?Lucene 是一个基于 Java 的全文搜索引擎库。
它提供了一系列的 API 和工具,用于创建、维护和搜索大规模文本数据集。
通过将文本数据索引到 Lucene 的索引库中,我们可以快速地进行全文搜索、排序和过滤等操作。
二、Lucene 的基本原理1. 倒排索引倒排索引是 Lucene 的核心概念之一。
它是一种数据结构,用于从词项到文档的映射。
通常,我们将文本数据分割成单词,然后对每个词项构建一个索引条目,该条目指向包含该词项的文档。
例如,假设我们有三个文档:文档1 包含 "Lucene 是一个搜索引擎库",文档2 包含 "Apache Lucene 是一个全文搜索库",文档3 包含 "Lucene 是基于 Java 的"。
在倒排索引中,我们将按照词项构建索引,如下所示:词项文档Lucene 1, 2, 3是 1, 2, 3一个 1, 2, 3搜索引擎库 1全文搜索库 2基于 3Java 3倒排索引的优势在于它能够快速地确定包含特定词项的文档,并且支持更复杂的查询表达式。
2. 分词器分词器是将原始文本分割成词项的模块。
Lucene 提供了多种分词器,如标准分词器、简单分词器等。
分词器还可以根据具体的需求进行定制。
分词器在构建索引和搜索时起到关键作用,它们确保在索引和搜索阶段都使用相同的分词规则。
3. 文档和字段在 Lucene 中,文档是一个最小的索引单位。
它由多个字段组成,每个字段包含一个词项或多个词项。
字段可以是文本、数值或日期等不同类型。
Lucene 中的文档和字段的设计灵活,可以根据实际需求进行定义和修改。
lucene入门实例(1):索引文本文件Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。
其功能非常的强大,api也很简单。
总得来说用Lucene来进行建立和搜索和操作数据库是差不多的(有点像),Document可以看作是数据库的一行记录,Field可以看作是数据库的字段。
用lucene实现搜索引擎就像用JDBC实现连接数据库一样简单。
Lucene3.0是最新版本Lucene3.0的下载地址是/lucene/java/ 。
本文使用Lucene2.2.例子一:1、在windows系统下的的C盘,建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件,随便起名啦,就叫"1.txt","2.txt"和"3.txt"啦其中1.txt的内容如下:中华人民共和国全国人民2006年而"2.txt"和"3.txt"的内容也可以随便写几写,这里懒写,就复制一个和1.txt文件的内容一样2、下载lucene包,放在classpath路径中建立索引:package lucenedemo.xmj;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.Date;import org.apache.lucene.analysis.Analyzer;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;public class TextFileIndexer {public static void main(String[] args) throws Exception {/* 指明要索引文件夹的位置,这里是C盘的S文件夹下*/File fileDir = new File( "c:\\s" );/* 这里放索引文件的位置*/File indexDir = new File("c:\\index" );Analyzer luceneAnalyzer = new StandardAnalyzer();IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,true );File[] textFiles = fileDir.listFiles();long startTime = new Date().getTime();// 增加document到索引去for ( int i = 0 ; i < textFiles.length; i ++ ) {if (textFiles[i].isFile() && textFiles[i].getName().endsWith( ".txt" )) { System.out.println( " File " + textFiles[i].getCanonicalPath()+ " 正在被索引.... " );String temp = FileReaderAll(textFiles[i].getCanonicalPath(),"GBK" );System.out.println(temp);Document document = new Document();Field FieldPath = new Field( " path " , textFiles[i].getPath(),Field.Store.YES, Field.Index.NO);Field FieldBody = new Field( " body " , temp, Field.Store.YES,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS);document.add(FieldPath);document.add(FieldBody);indexWriter.addDocument(document);}}// optimize()方法是对索引进行优化indexWriter.optimize();indexWriter.close();// 测试一下索引的时间long endTime = new Date().getTime();System.out.println( " 这花费了"+ (endTime - startTime)+ " 毫秒来把文档增加到索引里面去! "+ fileDir.getPath());}public static String FileReaderAll(String FileName, String charset)throws IOException {BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(FileName), charset));String line = new String();String temp = new String();while ((line = reader.readLine()) != null ) {temp += line;}reader.close();return temp;}}索引的结果:File C:\s\ 1 .txt正在被索引....中华人民共和国全国人民2006年File C:\s\ 2 .txt正在被索引....中华人民共和国全国人民2006年File C:\s\ 3 .txt正在被索引....中华人民共和国全国人民2006年这花费了297 毫秒来把文档增加到索引里面去! c:\spackage lucenedemo.xmj;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.queryParser.ParseException;import org.apache.lucene.queryParser.QueryParser;import org.apache.lucene.search.Hits;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;public class TestQuery {public static void main(String[] args) throws IOException, ParseException {Hits hits = null ;String queryString = "夏敏捷" ;Query query = null ;IndexSearcher searcher = new IndexSearcher( "c:\\index" );Analyzer analyzer = new StandardAnalyzer();try {QueryParser qp = new QueryParser( " body " , analyzer); query = qp.parse(queryString);} catch (ParseException e) {}if (searcher != null ) {hits = searcher.search(query);if (hits.length() > 0 ) {System.out.println(" 找到:"+ hits.length() + " 个结果! "); }elseSystem.out.println( " 没找到! " );}}}Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西,叫搜索。
lucene笔记-视频配套笔记传智播客 Java学院传智.入云龙全文检索技术之Lucene1 课程计划1、什么全文检索数据类型:结构化数据和非结构化数据非结构化数据查询方法全文检索的概念2、什么是Lucene3、Lucene实现全文检索的流程(重点)4、Lucene的入门程序(重点)5、分析器Analyzer(重点)7、索引库的维护(重点)i. 索引库的增加索引ii. 删除索引iii. 修改索引8、索引库的查询(重点)i. 使用Query的子类查询ii. 使用QueryParser查询8、相关的排序2 什么全文检索结构化数据:数据的长度类型是固定的。
数据库中的数据非结构化数据:长度不固定格式不固定。
Word文档、excel、pdf、txt。
2.1 结构化数据的查询使用sql语句查询就可以2.2 非结构化数据的查询需求:在文件中找出包含java字符的文档。
传智播客 Java学院传智.入云龙2.2.1 实现方法1、目测2、顺序扫描。
如果文件量大的话比如说20G,顺序扫描会变的很慢。
3、非结构化的数据变结构化先从文件中找出文件所有的词汇,形成一个列表。
查询的时候直接查询列表,找到关键词后根据这词找到相应的文档。
一次创建多次使用。
2.3 全文检索的概念这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
2.4 全文检索应用领域1、搜索引擎,百度、谷歌2、站内搜索a) 微博搜索b) 论坛搜索3、电商搜索,搜索的是商品信息。
3 什么是Lucene3.1 Lucene的概念Lucene是apache下的一个开放源代码的全文检索引擎工具包。
提供了完整的查询引擎和索引引擎,部分文本分析引擎。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。
3.2 Lucene和搜索引擎的区别Lucene是一个工具包:需要进行编程才能实现全文检索的功能呢搜索引擎:一套独立运行的系统,提供了全文检索功能。
第一讲:全文检索概述1.数据分类✓结构化的数据--具有固定格式和有限长度的数据,数据库中的表✓非结构化的数据-不定长度或无定格式的数据,邮件,word,网页✓半结构化的数据-xml数据,json数据对于像数据库一样的结构化数据,我们可以通过sql语句进行检索,对于非结构化数据,我们一般通过顺序扫描或者全文检索顺序扫描就是从第一条数据开始扫描一直到最后一条数据,把符合的数据返回,浪费时间,资源全文检索:先看上图左边,左边描述的是lucene把结构化数据,非结构化数据以及半结构化数据创建索引文件,右边描述的是用户通过索引关键词检索索引库,然后把结果返回给用户什么是索引:回想小学时候用的新华字典,提供了拼音检索和部首检索两个功能,通过这两个功能可以快速的找到一个字在字典的多少页,lucene里的索引和新华字典里的索引差不多看上图:该图可表示为lucene这个词在第1篇和第3篇文档里出现过,Solr这个词在第1篇、第3篇文和第五篇文档里出现过,Hadoop这个词在第3篇、第5篇、第7篇、第8篇、第9篇文档里出现过。
图的左边可以看作是新华字典里的拼音或者部首索引,右边就是检索出词语的位置,这里的索引又叫反向索引反向索引:这种由字符串到文件的映射是文件到字符串映射的反向过程,文件到字符串的映射,比如我们有一片PPT,里面内容的标题就是“全文检索概述-索引定义”,那么我们就可以把这一片PPT看成一个文件,名字就是“全文检索概述-索引定义”,这也就说明“全文检索概述-索引定义”在这个文件里出现过2.全文索引过程✓创建检索创建检索三部曲:需要检索的数据(Documents),分词技术(Analyzer),索引创建(indexer)第一步:Documents事例数据●极客学院教程●Luence案例开发●Lucene实时搜索第二步:分词技术(这里采用标准分词)●极|客|学|院|教|程●Luence|案|例|开|发●Lucene|实|时|搜|索●标准分词就是把一段中文分成一个个独立的单词,对于英文就是把它转换成词根。
Lucene索引和搜索过程核心类详解【基础】Lucene 索引和搜索过程核心类详解索引核心类1、IndexWriter(写索引)2、Directory(索引存放位置)3、Analyzer(分析器)4、document(文档)5、Field(域)搜索核心类1、IndexSearcher(搜索引)2、Term(搜索功能基本单元)3、Query(查询)4、TermQuery(Query 子类最基本查询类型)5、TopDocs(指针容器)IndexWriterIndexWriter是在索引过程中的中心组件。
这个类创建一个新的索引并且添加文档到一个已有的索引中。
它可以对索引进行添、删、更新操作,但是不能读取或搜索。
添加方法addDocument (Document)加Document使用默认的分词器addDocument (Document, Analyzer)加入的时候使用指定的分词器删除方法deleteDocuments (Term);deleteDocuments (Term[]);deleteDocuments (Query);deleteDocuments (Query[]);一般最好有个唯一索引,这样才好删,不然的话有可以会一删一大堆如:writer.deleteDocument(new Term(“ID”, documentID));更新方法注意:更新索引也提供两个方法,其实Lucene是没有办法更新的,只有先删除了再更新,updateDocument (Term, Document);如:writer.updateDocument(new Term(“ID”, documenteId), newDocument);updateDocument (Term, Document, Analyzer)DirectoryDirectory类代表一个Lucene索引的位置。
它是一个抽象类,允许它的子类(其中的两个包含在Lucene中)在合适时存储索引。
Lucene初级教程2007-12-26 15:24 点击次数:0 次1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品。
因此它并不像 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。
2 lucene的工作方式lucene提供的服务实际包含两部分:一入一出。
所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。
2.1写入流程源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。
将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。
将索引写入存储器,存储器可以是内存或磁盘。
2.2读出流程用户提供搜索关键词,经过analyzer处理。
对处理后的关键词搜索索引找出对应的Document。
用户根据需要从找到的Document中提取需要的Field。
3 一些需要知道的概念3.1 analyzerAnalyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。
分词的规则千变万化,但目的只有一个:按语义划分。
这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。
具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。
3.2 document用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。
一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。
lucene query 语法Lucene Query语法是Lucene搜索引擎中使用的一种搜索语法,由一系列的搜索参数和限制条件组成,用于为用户查询所需的结果。
虽然Lucene Query语法功能十分强大,但对于初学者来说可能有些复杂。
本文将为了帮助初学者更好地理解Lucene Query语法,介绍其特点、组成结构和使用方法等。
一、Lucene Query语法的特点1. 灵活性Lucene Query语法非常灵活,可以处理多种匹配和搜索需求,例如对单个词语、短语、模糊搜索以及实现排除性搜索等。
2. 分词器支持Lucene Query语法支持各种分词器,这样用户可以通过选择不同的分词器进行搜索结果的匹配。
3. 易于理解虽然Lucene Query语法具有很高的灵活性,但一旦熟悉了其语法结构,用户就很容易理解和应用查询条件。
二、Lucene Query语法的组成结构Lucene Query语法的查询结构由多个组成部分组成,每一个组件表示一个查询条件,可以是一个单独搜索条件,也可以是多个条件的组合形成的复合搜索条件连接。
1. 查询语法启动符:用于表示Lucene Query语法的开始,通常为“+”或“-”符号,用于表示是否搜索一个特定的项目或者排除一个项目2. 字段名:指定需要搜索的字段名称,可以是一个或多个,使用“:”符号将字段名和搜索参数或值隔开。
3. 搜索参数或值:需要搜索的参数或值,也可以使用布尔运算符(AND/OR)进行多个查询条件的组合。
例如:name:john AND age:254. 通配符:用于单个字符或多个字符的模糊匹配,例如:name:j* 可以匹配 john 或者 jacob5. 范围查找:指定需要查找的数据范围,使用“[ ]”表示查询范围6. 模糊搜索:使用“~”号后跟一个数字(0~1)表示模糊搜索的程度,数字越小表示模糊匹配程度越高7. 布尔运算符:用于将多个查询条件组合成一个复合查询条件。
Lucene教程详解Lucene-3.0.0配置一、Lucene开发环境配置step1.Lucene开发包下载step2.Java开发环境配置step3.Tomcat安装step4.Lucene开发环境配置解压下载的lucene-3.0.0.zip,可以看到lucene-core-3.0.0.jar和lucene-demos-3.0.0.jar这两个文件,将其解压(建议放在安装jdk的lib文件夹内),并把路径添加到环境变量的classpath。
二、Lucene开发包中Demo调试控制台应用程序step1.建立索引>java org.apache.lucene.demo.IndexFiles [C:\Java](已经存在的任意文件路径)将对C:\Java下所有文件建立索引,同时,在当前命令行位置将生成“index”文件夹。
step2.执行查询>java org.apache.lucene.demo.SearchFiles将会出现“Query:”提示符,在其后输入关键字,回车,即可得到查询结果。
Web应用程序step1.将lucene-core-3.0.0.jar和lucene-demos-3.0.0jar这两个文件复制到安装Tomcat 的\common\lib中step2.解压下载的lucene-3.0.0.zip,可以看到luceneweb.war文件。
将该文件复制到安装Tomcat的\webappsstep3.重启Tomcat服务器。
step4.建立索引>java org.apache.lucene.demo.IndexHTML -create -index [索引数据存放路径] [被索引文件路径](如:D:\lucene\temp\index D:\lucene\temp\docs)step5.打开安装Tomcat的\webapps\luceneweb\configuration.jsp文件,找到String indexLocation = "***",将"***"改为第四步中[索引数据存放路径],保存关闭。
1.概述Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。
它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能,本总结使用lucene--2.3.2。
2.lucene 的包结构1、org.apache.lucene.analysis对需要建立索引的文本进行分词、过滤等操作, 语言分析器,主要用于的切词Analyzer是一个抽象类,管理对文本内容的切分词规则。
2、org.apache.lucene.analysis.standard是标准分析器3、org.apache.lucene.document提供对Document和Field的各种操作的支持。
索引存储时的文档结构管理,类似于关系型数据库的表结构。
Document相对于关系型数据库的记录对象,Field主要负责字段的管理。
4、org.apache.lucene.index是最重要的包,用于向Lucene提供建立索引时各种操作的支持。
索引管理,包括索引建立、删除等。
索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。
5、org.apache.lucene.queryParser提供检索时的分析支持。
查询分析器,实现查询关键词间的运算,如与、或、非等。
6、org.apache.lucene.search 负责检索。
检索管理,根据查询条件,检索得到结果。
7、org.apache.lucene.store提供对索引存储的支持。
数据存储管理,主要包括一些底层的I/0操作。
8、org.apache.lucene.util提供一些常用工具类和常量类的支持3.索引文件格式a).fnm格式包含了Document中所有field名称b).fdt与.fdx格式.fdt文件用于存储具有Store.YES属性的Field的数据;.fdx是一个索引,用于存储Document在.fdt中的位置。
c).tis 与.tii格式.tis文件用于存储分词后的词条(Term),而.tii就是它的索引文件,它表明了每个.tis文件中的词条的位置。
d)deletable格式文档被删除后,会首先在deletable文件中留下一个记录,要真正删除时,才将索引除去。
e)复合索引格式.cfs使用IndexWriter的useCompoundFile() 默认为True4.lucene中主要的类4.1. Document文档类4.1.1.常用方法4.1.2.示例Document doc1 = new Document();doc1.add(new Field("name", "word1 word2 word3",Field.Store.NO,Field.Index.TOKENIZED)); Document doc2 = new Document();doc2.add(new Field("name", "word1 word2 word3",Field.Store.NO,Field.Index.TOKENIZED));4.2. Field字段类4.2.1.构造方法1)public Field(String name,String value,Store store,Index index);//直接的字符串方式2)public Field(String name,String value,Store store,Index index,TermVector termVector);3)public Field(String name,String value,Reader reader);//使用Reader从外部传入4)public Field(String name,String value,Reader reader,TermVector termVector);5)public Field(String name,byte[] value,Store store)//使用直接的二进制byte传入当Field值为二进制时,可以使用Lucene的压缩功能将其值进行压缩。
4.2.2.Store类4.2.3.Index类4.2.4.示例new Field("name", "word1 word2 word3",Field.Store.YES,Field.Index.TOKENIZED)4.3. IndexWriter类4.3.1.构造方法1)public IndexWriter(String path,Analyzer a,Boolean create)2)public IndexWriter(File path,Analyzer a,Boolean create)3)public IndexWriter(Directory d,Analyzer a,Boolean create)第一个参数:索引存放在什么地方第二个参数:分析器,继承自org.apache.lucene.analysis.Analyzer类第三个参数:为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。
所以在更新的过程中,需要设置该值为false。
4.3.2.添加文档public void addDocument(Document doc)public void addDocument(Document doc,Analyzer analyzer)//使用一个开发者自定义的,而非事先在构建IndexWriter时声明的Analyzer来进行分析writer.addDocument(doc1);4.3.3.性能参数1)mergeFactor控制Lucene在把索引从内存写入磁盘上的文件系统时内存中最大的Document数量,同时它还控制内存中最大的Segment数量。
默认为10.writer.setMergeFactor(10);2)maxMergeDocs限制一个Segment中最大的文档数量。
一个较大的maxMergeDocs适用于对大批量的文档建立索引,增量式的索引则应使用较小的maxMergeDocs。
writer.setMaxMergeDocs(1000);3)minMergeDocs用于控制内存中持有的文档数量的,它对磁盘上的Segment大小没有任何影响。
4.3.4.限制Field的长度maxFieldLength限制Field的长度,默认值为10000.最大值100000个。
public void setMaxFieldLength(int maxFieldLength)writer.addDocument(doc1);writer.setMaxFieldLength(100000);writer.addDocument(doc2);4.3.5.复合索引格式setUseCompoundFile(Boolean) 默认truewriter.setUseCompoundFile(true);//复合索引writer.setUseCompoundFile(false);4.3.6.优化索引writer.optimize();将磁盘上的多个segment进行合并,组成一个全新的segment。
这种方法并不会增加建索时的速度,反而会降低建索的速度。
所以应该在建完索引后在调用这个函数4.3.7.示例IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(), true);writer.addDocument(doc1);writer.addDocument(doc2);Sytem.out.println(writer.docCount());writer.close();IndexSearcher searcher = new IndexSearcher(path);Hits hits = null;Query query = null;QueryParser parser =new QueryParser("name", new StandardAnalyzer());query =parser.parse("word1");hits = searcher.search(query);System.out.println("查找word1 共" + hits.length() + "个结果");4.4. Directory类Directory:用于索引的存放位置a)FSDirectory.getDirectory(path, true)第二个参数表示删除掉目录内原有内容IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);//删除原有索引或FSDirectory fsDir=FSDirectory.getDirectory(path,true);IndexWriter writer = new IndexWriter(fsDir, new StandardAnalyzer(), true);b)RAMDirectory在内存中存放,读取速度快,但程序一运行结束,它的内容就不存在了RAMDirectory ramDir=new RAMDirectory();IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(), true);或IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true); 4.5. IndexReader类IndexReader类――索引的读取工具4.5.1.删除文档IndexReader reader=IndexReader.open(path);reader.deleteDocument(0);//删除第一个reader.close();4.5.2.反删除reader.undeleteAll();4.5.3.按字段删除reader.deleteDocuments(new Term("name","word1"));若要真正物理删除,则只需使用IndexWriter对索引optimize一次即可!4.5.4.示例IndexReader reader=IndexReader.open(path);for(int i=0;i<reader.numDocs();i++){System.out.println(reader.document(i));}System.out.println("版本:"+reader.getVersion());System.out.println("索引内的文档数量:"+reader.numDocs());//reader.deleteDocuments(new Term("name","word1"));Term term1=new Term("name","word1");TermDocs docs=reader.termDocs(term1);while(docs.next()){System.out.println("含有所查找的"+term1+"的Document的编号为"+docs.doc());System.out.println("Term在文档中的出现次数"+docs.freq());}reader.close();4.6. IndexModifier类集成了IndexWriter的大部分功能和IndexReader中对索引删除的功能------ Lucene2.0的新类4.6.1.示例public static void main(String[] args) throws Exception {IndexModifier modifier=new IndexModifier("C:\\Q1",new StandardAnalyzer(),true);Document doc1=new Document();doc1.add(new Field("bookname","钢铁是怎样炼成的",Field.Store.YES,Field.Index.TOKENIZED));Document doc2=new Document();doc2.add(new Field("bookname","山山水水",Field.Store.YES,Field.Index.TOKENIZED));modifier.addDocument(doc1);modifier.addDocument(doc2);System.out.println(modifier.docCount());modifier.setUseCompoundFile(false);modifier.close();IndexModifier mo=new IndexModifier("C:\\Q1",new StandardAnalyzer(),false);mo.deleteDocument(0);System.out.println(mo.docCount());mo.close();}4.7. IndexSearcher类4.7.1.构造方法IndexSearcher searcher = new IndexSearcher(String path);IndexSearcher searcher = new IndexSearcher(Directory directory); IndexSearcher searcher = new IndexSearcher(IndexReader r);IndexSearcher searcher = new IndexSearcher(IndexReader r,Boolean closeReader); IndexSearcher searcher = new IndexSearcher(path);IndexSearcher searcher = new IndexSearcher(FSDirectory.getDirectory(path,false) );4.7.2.search方法//返回Hits对象public Hits search(Query query)public Hits search(Query query,Filter filter)public Hits search(Query query,Sort sort)public Hits search(Query query,Filter filter,Sort sort)//检索只返回得分最高的Documentpublic TopDocs search(Query query,Filter filter,int n)public TopDocs search(Weight weight,Filter filter,int n)public TopFieldDocs search(Weight weight,Filter filter,int n,Sort sort)public TopFieldDocs search(Query query,Filter filter,int n,Sort sort)//传入HitCollector,将结果保存在HitCollector中public void search(Query query,HitCollector results)public void search(Query query,Filter filter,HitCollector results)public void search(Weight weight,Filter filter,HitCollector results)4.7.3.Searcher的explain方法public Explaination explain(Query query,int doc)throws IOExceptionfor(int i=0;i<hits.length()&&i<10;i++){Document d=hits.doc(i);System.out.println(i+" "+hits.score(i)+" "+d.get("contents"));System.out.println(searcher.explain(query,hits.id(i)).toString()) ;}4.7.4.示例IndexSearcher searcher = new IndexSearcher(path);Hits hits = null;Query query = null;QueryParser parser =new QueryParser("contents", new StandardAnalyzer());query =parser.parse("11");hits = searcher.search(query);System.out.println("查找 word1 共" + hits.length() + "个结果");for(int i=0;i<hits.length()&&i<10;i++){Document d=hits.doc(i);System.out.println(d+" "+i+" "+hits.score(i)+""+d.get("contents"));}searcher.close();4.8. Hits类4.8.1.概述Hits类――检索结果4.8.2.常用方法4.8.3.示例for(int i=0;i<hits.length()&&i<10;i++){Document d=hits.doc(i);System.out.println(d+" "+" "+hits.score(i)+" "+d.get("contents"));System.out.println("文档的内部ID号:" + hits.id(i));}4.9. QueryParser类4.9.1.改变默认的布尔逻辑默认为“或”关系Query query = null;QueryParser parser =new QueryParser("contents", new StandardAnalyzer()); query =parser.parse("hello world!");System.out.println(query.toString());改变默认布尔逻辑Query query = null;QueryParser parser =new QueryParser("contents", new StandardAnalyzer()); parser.setDefaultOperator(QueryParser.AND_OPERATOR);query =parser.parse("hello world");//若world后加!会出错System.out.println(query.toString());AND OR NOT –关键字也可以不用改变默认布尔逻辑,而直接让用户在输入关键字时指定不同词条间的布尔联系。