Lucene学习笔记之(五)lucene的特殊查询

步骤一:创建maven现目


步骤二:配置pom.xml文件,代码如下:

 <pre name="code" class="java">                <!-- junit包
			因为是java程序,,需要用到@Test,这就是他的jar包下载。-->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

		<!-- lucene核心包 
			以下这三个是用在lucene的全部jar包,core是核心包,queryparser是查询jar包。
			查询被索引文件如果是全英文的情况下,pom.xml文件写这三个,就欧了!-->
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-core</artifactId>
			<version>5.3.1</version>
		</dependency>

		<!-- 查询解析器 -->
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-queryparser</artifactId>
			<version>5.3.1</version>
		</dependency>

		<!-- 分析器 -->
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-analyzers-common</artifactId>
			<version>5.3.1</version>
		</dependency>
		<!-- 很明显,这个是查询被检索文件为全中文的情况下,
			加上以上的三个,再加上这两个就行了。
			值得提一下,“高亮显示”的jar包可加可不加,
			在这里面加上,是因为这个在后面会用到。
			但是还是建议大家把这个加上,懂得多也不是个错。
		 	-->
		<!-- 中文分词查询器smartcn -->
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-analyzers-smartcn</artifactId>
			<version>5.3.1</version>
		</dependency>

		<!-- 高亮显示 -->
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-highlighter</artifactId>
			<version>5.3.1</version>
		</dependency>

 步骤三:开始建包写代码 

//显示向文档里写索引
//********Indexer    Start************************

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;
	
	/**
	 *实例化indexerWriter
	 * @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;
	}
	
	/**
	 * 获取indexDir
	 * @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("E:\\luceneDemo5");
		
		System.out.println("写索引成功!");
	}
	
}
//********Indexer    End************************


效果显示如下:


写索引成功,那就是根据所以 来进行 特殊查询!代码如下:

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 SearchTest {

	private Directory dir;
	private IndexReader reader;
	private IndexSearcher is;
	
	@Before
	public void setUp() throws Exception {
		dir=FSDirectory.open(Paths.get("E:\\luceneDemo5"));
		reader=DirectoryReader.open(dir);
		is=new IndexSearcher(reader);
	}

	@After
	public void tearDown() throws Exception {
		reader.close();
	}

	/**
	 * ָ指定项范围查询 TermRangeQuery ;(对应图一)
	 * @throws Exception
	 */
	@Test
	public 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"));
		}		
	}
}
 
效果如下:

图一:


       /**
	 * 指定数字范围查询 NumericRangeQuery ;(对应图二)
	 * @throws Exception
	 */
	@Test
	public 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"));
		}		
	}
	
	

图二:


/**
	 * 指定字符串开头搜索 PrefixQuery ;(对应图三)
	 * @throws Exception
	 */
	@Test
	public void testPrefixQuery()throws Exception{
		
		//运用term来查找
		PrefixQuery query=new PrefixQuery(new Term("city","c"));
		
		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"));
		}	
	}
图三:


/**
	 * 组合查询 BooleanQuery (对应图四)
	 * @throws Exception
	 */
	@Test
	public void testBooleanQuery()throws Exception{
		
		//指定数字范围查询 NumericRangeQuery ;
		NumericRangeQuery<Integer> query1=NumericRangeQuery.newIntRange("id", 1, 2, true, true);
		
		//指定字符串开头搜索 PrefixQuery ;
		PrefixQuery query2=new PrefixQuery(new Term("city","a"));
		
		//核心句
		BooleanQuery.Builder booleanQuery=new BooleanQuery.Builder();
		
		//把多条件查询的query都加到BooleanQuery中去
		/**
		 * FILTER:是否统计的意思,一般不常用;
		 * MUST:相当于 and,同时满足条件;
		 * MUST_NOT:相当于not;
		 * SHOULD:相当于or,两者满足一个条件即可查出
		 */
		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"));
		}	
	}


图四:


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值