Lucene6入门教程(六)搜索查询方式

xiaoxiao2021-02-28  97

Lucene6的搜索查询方式主要有两大类: QueryParser类和Query的5个子类,其中, QueryParser类几乎能够用所有的查询

代码如下:你需要自己改一下索引地址(已经有索引了的)和索引对象 package com.SearchDetilCCTV;

/** * Created by mo */ import java.nio.file.FileSystems; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.Term; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.*; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.BytesRef; /* * 创建Directory 创建IndexReader 根据IndexReader创建IndexSearch 创建搜索的Query 根据searcher搜索并且返回TopDocs 根据TopDocs获取ScoreDoc对象 根据searcher和ScoreDoc对象获取具体的Document对象 根据Document对象获取需要的值 * */ class SearchTest { /** * 搜索 */ DirectoryReader directoryReader = null; // 1、创建Directory; // 4、创建搜索的Query Analyzer analyzer = new StandardAnalyzer(); // 创建parser来确定要搜索文件的内容,第一个参数为搜索的域 public void search(){//(String keyWord) { try { Directory directory = FSDirectory.open(FileSystems.getDefault().getPath("D:\\workspace\\lucene6.4.1\\learing2017.8\\0817\\index")); // 2、创建IndexReader directoryReader = DirectoryReader.open(directory); // 3、根据IndexReader创建IndexSearch IndexSearcher indexSearcher = new IndexSearcher(directoryReader); long start = System.currentTimeMillis(); QueryParser queryParser = new QueryParser("content", analyzer); // 创建Query表示搜索域为content包含UIMA的文档 Query query = queryParser.parse("cctv1"); //11111 TermQuery 搜索特定的项 //Query query = new TermQuery(new Term("content","cctv10")); //22222 TermRangeQuery 搜索特定范围的项,这个 Query 不适用于数字范围查询,数字范围查询请使用 NumericRangeQuery 代替 // Query query = new TermRangeQuery("content",new BytesRef("cctv1"),new BytesRef("cctv10"),true,true); //PointRangeQuery query = PointRangeQuery.checkArgs("content","cctv","cc");//newIntRange(field,start,end,true,true); //33333 PrefixQuery 前缀匹配搜索 // Query query = new PrefixQuery(new Term("content","cctv")); //44444 WildcardQuery 通配符搜索 // Query query = new WildcardQuery(new Term("content","?ctv*")); //55555 FuzzyQuery 模糊匹配搜索 // 模糊匹配的意思是:搜索的关键字即使有错,在一定范围内都可以被搜索到 //maxEdits:模糊字数,[0,2]之间,若为0,相当于TermQuery。 // FuzzyQuery(Term term, int maxEdits, int prefixLength):prefixLength,指定要有多个前缀字母必须完全匹配。 // FuzzyQuery query = new FuzzyQuery(new Term("content","ccta"),2,3); ; // 5、根据searcher搜索并且返回TopDocs TopDocs topDocs = indexSearcher.search(query, 10); long end = System.currentTimeMillis(); System.out.println("时间: "+(end - start)+"ms"); System.out.println("查找到的文档总共有:"+topDocs.totalHits); System.out.println("查找到的文档总共有:"+topDocs.scoreDocs); System.out.println("查找到的内容:"+query.toString()); // 6、根据TopDocs获取ScoreDoc对象 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDocs) { // 7、根据searcher和ScoreDoc对象获取具体的Document对象 Document document = indexSearcher.doc(scoreDoc.doc); // 8、根据Document对象获取需要的值 System.out.println("文档名: "+document.get("filename")); System.out.println("地址path: "+document.get("filepath")); } long end2 = System.currentTimeMillis(); System.out.println("时间: "+(end2 - start)+"ms"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (directoryReader != null) { directoryReader.close(); } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String args[]) { SearchTest newSearch = new SearchTest(); newSearch.search(); } }
转载请注明原文地址: https://www.6miu.com/read-52347.html

最新回复(0)