Lucene查询方式

来源:互联网 发布:zabbix snmp 端口号 编辑:程序博客网 时间:2024/06/06 09:13

本文讲解6种查询方式

指定项查询、queryParse查询、指定项范围查询、指定数字范围查询、指定字符串开头查询、组合查询

自己提前准备一些数据以便测试

直接Demo

package com.gcx.search;import java.io.File;import java.io.FileReader;import java.nio.file.Paths;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.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;public class Indexer {private IndexWriter writer; // 写索引实例/** * 构造方法 实例化IndexWriter * @param indexDir * @throws Exception */public Indexer(String indexDir)throws Exception{Directory dir=FSDirectory.open(Paths.get(indexDir));Analyzer analyzer=new StandardAnalyzer(); // 标准分词器IndexWriterConfig iwc=new IndexWriterConfig(analyzer);writer=new IndexWriter(dir, iwc);}/** * 关闭写索引 * @throws Exception */public void close()throws Exception{writer.close();}/** * 索引指定目录的所有文件 * @param dataDir * @throws Exception */public int index(String dataDir)throws Exception{File []files=new File(dataDir).listFiles();for(File f:files){indexFile(f);}return writer.numDocs();}/** * 索引指定文件 * @param f */private void indexFile(File f) throws Exception{System.out.println("索引文件:"+f.getCanonicalPath());Document doc=getDocument(f);writer.addDocument(doc);}/** * 获取文档,文档里再设置每个字段 * @param f */private Document getDocument(File f)throws Exception {Document doc=new Document();doc.add(new TextField("contents",new FileReader(f)));doc.add(new TextField("fileName", f.getName(),Field.Store.YES));doc.add(new TextField("fullPath",f.getCanonicalPath(),Field.Store.YES));return doc;}public static void main(String[] args) {String indexDir="D:\\lucene4";String dataDir="D:\\lucene4\\data";Indexer indexer=null;int numIndexed=0;long start=System.currentTimeMillis();try {indexer = new Indexer(indexDir);numIndexed=indexer.index(dataDir);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {indexer.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}long end=System.currentTimeMillis();System.out.println("索引:"+numIndexed+" 个文件 花费了"+(end-start)+" 毫秒");}}
生成索引后,开始查询

package com.gcx.search;import java.nio.file.Paths;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.IndexReader;import org.apache.lucene.index.Term;import org.apache.lucene.queryparser.classic.QueryParser;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TermQuery;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.junit.After;import org.junit.Before;import org.junit.Test;public class SearchTest {private Directory dir;private IndexReader reader;private IndexSearcher is;@Beforepublic void setUp() throws Exception {dir=FSDirectory.open(Paths.get("D:\\lucene4"));reader=DirectoryReader.open(dir);is=new IndexSearcher(reader);}@Afterpublic void tearDown() throws Exception {reader.close();}/** * 对特定项搜索 * @throws Exception */@Testpublic void testTermQuery()throws Exception{String searchField="contents";String q="particular";Term t=new Term(searchField,q);Query query=new TermQuery(t);TopDocs hits=is.search(query, 10);System.out.println("匹配 '"+q+"',总共查询到"+hits.totalHits+"个文档");for(ScoreDoc scoreDoc:hits.scoreDocs){Document doc=is.doc(scoreDoc.doc);System.out.println(doc.get("fullPath"));}}/** * 解析查询表达式 * @throws Exception */@Testpublic void testQueryParser()throws Exception{Analyzer analyzer=new StandardAnalyzer(); // 标准分词器String searchField="contents";String q="abc~";QueryParser parser=new QueryParser(searchField, analyzer);Query query=parser.parse(q);TopDocs hits=is.search(query, 100);System.out.println("匹配 "+q+"查询到"+hits.totalHits+"个记录");for(ScoreDoc scoreDoc:hits.scoreDocs){Document doc=is.doc(scoreDoc.doc);System.out.println(doc.get("fullPath"));}}}

再来一波demo

package com.gcx.otherSearch;import java.nio.file.Paths;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.document.IntField;import org.apache.lucene.document.StringField;import org.apache.lucene.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;public class Indexer {private Integer ids[]={1,2,3};private String citys[]={"aingdao","banjing","changhai"};private String descs[]={"Qingdao is b beautiful city.","Nanjing is c city of culture.","Shanghai is d bustling city."};private Directory dir;/** * 获取IndexWriter实例 * @return * @throws Exception */private IndexWriter getWriter()throws Exception{Analyzer analyzer=new StandardAnalyzer(); // 标准分词器IndexWriterConfig iwc=new IndexWriterConfig(analyzer);IndexWriter writer=new IndexWriter(dir, iwc);return writer;}/** * 生成索引 * @param indexDir * @throws Exception */private void index(String indexDir)throws Exception{dir=FSDirectory.open(Paths.get(indexDir));IndexWriter writer=getWriter();for(int i=0;i<ids.length;i++){Document doc=new Document();doc.add(new IntField("id", ids[i], Field.Store.YES));doc.add(new StringField("city",citys[i],Field.Store.YES));doc.add(new TextField("desc", descs[i], Field.Store.YES));writer.addDocument(doc); // 添加文档}writer.close();}public static void main(String[] args) throws Exception {new Indexer().index("D:\\lucene5");}}
生成索引后,进行查询

package com.gcx.otherSearch;import java.nio.file.Paths;import org.apache.lucene.document.Document;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.Term;import org.apache.lucene.search.BooleanClause;import org.apache.lucene.search.BooleanQuery;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.NumericRangeQuery;import org.apache.lucene.search.PrefixQuery;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TermRangeQuery;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.BytesRef;import org.junit.After;import org.junit.Before;import org.junit.Test;public class otherQuery {private Directory dir;private IndexReader reader;private IndexSearcher is;@Beforepublic void setUp() throws Exception {dir=FSDirectory.open(Paths.get("D:\\lucene5"));reader=DirectoryReader.open(dir);is=new IndexSearcher(reader);}@Afterpublic void tearDown() throws Exception {reader.close();}/** * 指定项范围搜索 * @throws Exception */@Testpublic void testTermRangeQuery()throws Exception{TermRangeQuery query=new TermRangeQuery("desc", new BytesRef("b".getBytes()), new BytesRef("c".getBytes()), true, true);TopDocs hits=is.search(query, 10);for(ScoreDoc scoreDoc:hits.scoreDocs){Document doc=is.doc(scoreDoc.doc);System.out.println(doc.get("id"));System.out.println(doc.get("city"));System.out.println(doc.get("desc"));}}/** * 指定数字范围 * @throws Exception */@Testpublic void testNumericRangeQuery()throws Exception{NumericRangeQuery<Integer> query=NumericRangeQuery.newIntRange("id", 1, 2, true, true);TopDocs hits=is.search(query, 10);for(ScoreDoc scoreDoc:hits.scoreDocs){Document doc=is.doc(scoreDoc.doc);System.out.println(doc.get("id"));System.out.println(doc.get("city"));System.out.println(doc.get("desc"));}}/** * 指定字符串开头搜索 * @throws Exception */@Testpublic void testPrefixQuery()throws Exception{PrefixQuery query=new PrefixQuery(new Term("city","a"));TopDocs hits=is.search(query, 10);for(ScoreDoc scoreDoc:hits.scoreDocs){Document doc=is.doc(scoreDoc.doc);System.out.println(doc.get("id"));System.out.println(doc.get("city"));System.out.println(doc.get("desc"));}}/** * 多条件查询 * @throws Exception */@Testpublic void testBooleanQuery()throws Exception{NumericRangeQuery<Integer> query1=NumericRangeQuery.newIntRange("id", 1, 2, true, true);PrefixQuery query2=new PrefixQuery(new Term("city","a"));BooleanQuery.Builder booleanQuery=new BooleanQuery.Builder();booleanQuery.add(query1,BooleanClause.Occur.MUST);booleanQuery.add(query2,BooleanClause.Occur.MUST);TopDocs hits=is.search(booleanQuery.build(), 10);for(ScoreDoc scoreDoc:hits.scoreDocs){Document doc=is.doc(scoreDoc.doc);System.out.println(doc.get("id"));System.out.println(doc.get("city"));System.out.println(doc.get("desc"));}}}



原创粉丝点击