Lucene的Query及Searcher带你走上人生巅峰

Query及Searcher

搜索是全文检索中最重要的一部分,前面HelloWorld中也发现,Query对象只是一个接口,他有很多子类的实现。在前面直接使用QueryParser的Parse方法来创建Query对象的实例,实际他会根据我们传入的搜索关键字自动解析成需要的查询类型,索引在这里我

public class Lucene_query {
	// 索引库文件夹的地址
	public String path = "C:\\Users\\MacBook\\Desktop\\web4\\Lucene\\index";

	// 查询字符形式
	public void testSearch(String keyword) throws Exception {
		// 用户输入关键字
		// String keyword="hello";
		// 索引目录
		Directory directory = FSDirectory.open(Paths.get(path));
		// 索引读取对象
		IndexReader r = DirectoryReader.open(directory);
		// 获取搜索对象
		IndexSearcher indexSearcher = new IndexSearcher(r);
		// 分词器 -StandardAnalyzer (标准分词器) 英文
		Analyzer analyzer = new StandardAnalyzer();
		// 获取解析查询对象
		QueryParser queryParser = new QueryParser("content", analyzer);
		// 查询关键字在索引库匹配
		Query query = queryParser.parse(keyword);
		// 查询搜索 5 查询分页
		TopDocs topDocs = indexSearcher.search(query, 5);
		// 查出来的总数
		System.out.println("总条数:" + topDocs.totalHits);
		// 循环查出来的对象
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int docId = scoreDoc.doc;
			// 通过id获取文档对象
			Document doc = indexSearcher.doc(docId);
			System.out.println("id:" + doc.get("id") + " content:" + doc.get("content"));
		}
	}

	// 通过查询对象来查询
	public void testSearch(Query query) throws Exception {
		// 用户输入关键字
		// String keyword="hello";
		// 索引目录
		Directory directory = FSDirectory.open(Paths.get(path));
		// 索引读取对象
		IndexReader r = DirectoryReader.open(directory);
		// 获取搜索对象
		IndexSearcher indexSearcher = new IndexSearcher(r);
		// 分词器 -StandardAnalyzer (标准分词器) 英文
		Analyzer analyzer = new StandardAnalyzer();
		// 获取解析查询对象
		// QueryParser queryParser = new QueryParser("content", analyzer);
		// 查询关键字在索引库匹配
		// Query query = queryParser.parse(keyword);
		// 查询搜索 5 查询分页
		TopDocs topDocs = indexSearcher.search(query, 5);
		// 查出来的总数
		System.out.println("总条数:" + topDocs.totalHits);
		// 循环查出来的对象
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int docId = scoreDoc.doc;
			// 通过id获取文档对象
			Document doc = indexSearcher.doc(docId);
			System.out.println("id:" + doc.get("id") + " content:" + doc.get("content"));
		}
	}

	// 高级查询
	// Term 单词查询
	@Test
	public void testTerm() throws Exception {
		// 简写方式查询
		testSearch("content:hello");
		System.out.println("===================================");
		// 查询对象查询
		Query query = new TermQuery(new Term("content", "hello"));
		testSearch(query);
	}

	// 段落查询
	// 整体查询 (当成整体查询)
	@Test
	public void testPhsee() throws Exception {
		// 简写方式查询
		testSearch("\"hello java\"");
	}

	// 通配符查询 * n 个 ? 1个
	@Test
	public void testwild() throws Exception {
		// 简写方式查询
		testSearch("luce*e");
	}

	// 模糊查询(容错查询) ~2 代表 容错几个 最多只能2个
	@Test
	public void testLike() throws Exception {
		// 简写方式查询
		testSearch("lucexx~2");
	}

	// 临近查询
	@Test
	public void testLj() throws Exception {
		// 简写方式查询
		testSearch("\"hello world\"~2");
	}

	// + (must) : 对应的单词必须出现
	// - (must_not): 不能出现
	// 不写 (should): 可能出现
	// 关键字之间的逻辑计算是 AND
	
	// 组合查询
	@Test
	public void testzh() throws Exception {
		// 简写方式查询
		testSearch("java hello");
	}

}

们也可以直接new一个Query实例来达到不同的搜索效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值