Lucene查询对象浅析(2)
Lucene查询对象浅析(二)
第四种:短语搜索。一般用户在搜索的时候都会输入一个关键词来搜索,短语搜索就是用来应对这种需求的。
Document doc1 = new Document(); Document doc2 = new Document(); Document doc3 = new Document(); Field field1 = new Field("postTitle","Java语言",Field.Store.YES,Field.Index.TOKENIZED); Field field2 = new Field("postTitle","言语",Field.Store.YES,Field.Index.TOKENIZED); Field field3 = new Field("postTitle","Luene开发详解",Field.Store.YES,Field.Index.TOKENIZED); doc1.add(field1); doc2.add(field2); doc3.add(field3); IndexWriter writer = new IndexWriter(STORE_PATH, new StandardAnalyzer(), true); writer.addDocument(doc1); writer.addDocument(doc2); writer.addDocument(doc3); writer.close(); PhraseQuery query = new PhraseQuery(); query.add(new Term("postTitle","语")); query.add(new Term("postTitle","言")); IndexSearcher searcher = new IndexSearcher(STORE_PATH); Hits hits = searcher.search(query); System.out.println("phraseQuery demo------"); System.out.println("hits.length()==" + hits.length()); for(int i = 0;i<hits.length();i++){ System.out.println(hits.doc(i)); }
运行结果:
phraseQuery demo------ hits.length()==1 Document<stored/uncompressed,indexed,tokenized<postTitle:Java语言>>
第五种:多短语搜索。多短语搜索顾名思意也就是对多个短语进行搜索,它容许指定短语的前缀和后缀来进行组合,然后在进行搜索。
代码如下:
Document doc1 = new Document(); Document doc2 = new Document(); Document doc3 = new Document(); Field field1 = new Field("postTitle","中国人是伟大的",Field.Store.YES,Field.Index.TOKENIZED); Field field2 = new Field("postTitle","中华名族是伟大的名族",Field.Store.YES,Field.Index.TOKENIZED); Field field3 = new Field("postTitle","党中央",Field.Store.YES,Field.Index.TOKENIZED); doc1.add(field1); doc2.add(field2); doc3.add(field3); IndexWriter writer = new IndexWriter(STORE_PATH, new StandardAnalyzer(), true); writer.addDocument(doc1); writer.addDocument(doc2); writer.addDocument(doc3); writer.close(); MultiPhraseQuery query = new MultiPhraseQuery(); //加入短语前缀 query.add(new Term("postTitle","中")); //加入短语后缀 query.add(new Term[]{new Term("postTitle","国"),new Term("postTitle","华"),new Term("postTitle","央")}); IndexSearcher searcher = new IndexSearcher(STORE_PATH); Hits hits = searcher.search(query); System.out.println("multiPhraseQuery demo------"); System.out.println("hits.length()==" + hits.length()); for(int i = 0;i<hits.length();i++){ System.out.println(hits.doc(i)); }
运行结果如下:
multiPhraseQuery demo------ hits.length()==3 Document<stored/uncompressed,indexed,tokenized<postTitle:党中央>> Document<stored/uncompressed,indexed,tokenized<postTitle:中国人是伟大的>> Document<stored/uncompressed,indexed,tokenized<postTitle:中华名族是伟大的名族>>
第六种:前缀搜索。前缀搜索主要是用来根据指定的前缀进行搜索。
代码如下:
Document doc1 = new Document(); Document doc2 = new Document(); Document doc3 = new Document(); Field field1 = new Field("postTitle","Java语言简介",Field.Store.YES,Field.Index.TOKENIZED); Field field2 = new Field("postTitle","JavaEE各种框架",Field.Store.YES,Field.Index.TOKENIZED); Field field3 = new Field("postTitle","Luene开发详解",Field.Store.YES,Field.Index.TOKENIZED); doc1.add(field1); doc2.add(field2); doc3.add(field3); IndexWriter writer = new IndexWriter(STORE_PATH, new StandardAnalyzer(), true); writer.addDocument(doc1); writer.addDocument(doc2); writer.addDocument(doc3); writer.close(); Term term = new Term("postTitle","java"); Query query = new PrefixQuery(term); IndexSearcher searcher = new IndexSearcher(STORE_PATH); Hits hits = searcher.search(query); System.out.println("PrefixQuery demo------"); System.out.println("hits.length()==" + hits.length()); for(int i = 0;i<hits.length();i++){ System.out.println(hits.doc(i)); }
运行结果:
PrefixQuery demo------ hits.length()==2 Document<stored/uncompressed,indexed,tokenized<postTitle:Java语言简介>> Document<stored/uncompressed,indexed,tokenized<postTitle:JavaEE各种框架>>