1.1. 实现步骤
第一步:创建一个Directory对象,也就是索引库存放的位置。
第二步:创建一个indexReader对象,需要指定Directory对象。
第三步:创建一个indexsearcher对象,需要指定IndexReader对象
第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。
第五步:执行查询。
第六步:返回查询结果。遍历查询结果并输出。
第七步:关闭IndexReader对象
1.2.IndexSearcher搜索方法
1.3.query查询语句对象
对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Field的name为“lucene”的文档信息。
1.3.1.使用QueryParser查询
通过QueryParser也可以创建Query,QueryParser提供一个Parse方法,此方法可以直接根据查询语法来查询。Query对象执行的查询语法可通过System.out.println(query);查询。需要使用到分析器。创建索引时使用的分析器和查询索引时使用的分析器要一致。
1.3.2.使用query的子类查询
TermQuery:
根据词进行搜索(只能从文本中进行搜索)
QueryParser:
根据域名进行搜索,可以设置默认搜索域,推荐使用. (只能从文本中进行搜索)
NumericRangeQuery:
从数值范围进行搜索
BooleanQuery:
组合查询,可以设置组合条件,not and or.从多个域中进行查询
must相当于and关键字,是并且的意思
should,相当于or关键字或者的意思
must_not相当于not关键字, 非的意思
注意:单独使用must_not 或者 独自使用must_not没有任何意义
MatchAllDocsQuery:
查询出所有文档
MultiFieldQueryParser:
可以从多个域中进行查询,只有这些域中有关键词的存在就查询出来
1.4.代码
1 @Test 2 public void testIndexSearch() throws Exception{ 3 4 //创建分词器(与创建索引用同样的分词器) 5 Analyzer analyzer=new StandardAnalyzer(); 6 //创建查询对象:第一个参数:默认搜索域 第二个参数 :分词器 7 //默认搜索的作用:如果搜索语法中指定了域名,从指定域中搜索,如果未指定从默认搜索域中搜索 8 QueryParser queryParser=new QueryParser("fileContext",analyzer); 9 //查询语法 域名:搜索关键字 10 Query query = queryParser.parse("fileContext:java"); 11 12 13 //指定索引的目录 14 Directory directory= FSDirectory.open(new File("E:\ideaworkpase\demotest\luceneindex")); 15 //索引的读取对象 16 IndexReader indexReader=IndexReader.open(directory); 17 //创建索引的搜索对象 18 IndexSearcher indexSearcher=new IndexSearcher(indexReader); 19 //搜索:第一个参数:查询语句对象 第二个参数:指定显示记录数 20 TopDocs search = indexSearcher.search(query, 10); 21 //一共搜索到多少条记录 22 System.out.println("====total===:"+search.totalHits); 23 24 //从搜索结果对象中获取结果集 25 ScoreDoc [] scoreDocs=search.scoreDocs; 26 for(ScoreDoc scoreDoc:scoreDocs){ 27 //获取Id 28 int docID=scoreDoc.doc; 29 //通过文档ID从硬盘上获取文档 30 Document document = indexReader.document(docID); 31 //get域名,打印出值 32 System.out.println("+++++fileName++++:"+document.get("fileName")); 33 }