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各种框架>>