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()==1Document<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()==3Document<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()==2Document<stored/uncompressed,indexed,tokenized<postTitle:Java语言简介>>Document<stored/uncompressed,indexed,tokenized<postTitle:JavaEE各种框架>>
?