全文检索Lucene(三)----查询,分词器,排序,过滤,高亮

本文详细介绍了Lucene的查询操作,包括关键词、范围、通配符、模糊和短语查询,以及布尔查询的使用。同时讨论了QueryParser与MultiFieldQueryParser的区别。接着,文章阐述了分词器的重要性和工作流程,如StandardAnalyzer、CJKAnalyzer以及第三方的IKAnalyzer。此外,还讲解了如何通过Boost和Sort调整搜索结果的排序,以及使用Filter进行结果过滤。最后,提到了高亮显示的关键类,并给出了相关代码示例。
摘要由CSDN通过智能技术生成

Lucene查询:
查询出所有
关键词查询
范围查询
通配符查询
模糊查询
短语查询
布尔查询

QueryParser与MultiFieldQueryParser的区别
QueryParser:只在一个字段中查询
MultiFieldQueryParser:可以在多个字段查询

布尔查询:
public void add(Query query, Occur occur)

Occur 用于表示布尔查询子句关系的类,包括:
Occur.MUST,Occur.MUST_NOT,Occur.SHOULD。

1, MUST和MUST:取得连个查询子句的交集。
2, MUST和MUST_NOT:包含MUST并且查询结果中不包含MUST_NOT的检索结果。
3, SHOULD与SHOULD,表示“或”关系,最终检索结果为所有检索子句的并集。

一般不单独使用,因为单独就不应使用BooleanQuery了。

使用时注意:
1, 单独使用MUST_NOT:无意义,检索无结果。(也不报错)
2, MUST_NOT和MUST_NOT:无意义,检索无结果。(也不报错)

3, 单独使用SHOULD:结果相当于MUST。
4, SHOULD和MUST_NOT: 此时SHOULD相当于MUST,结果同MUST和MUST_NOT。
5, MUST和SHOULD:此时SHOULD无意义,结果为MUST子句的检索结果。

代码示例(utils和bean类可以去上一篇文章中去找):

package com.my.lucene;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.util.Version;
import org.junit.Test;

import com.my.bean.Article;
import com.my.utils.ArticleDocumentUtils;
import com.my.utils.Configuration;

public class QueryTest {

	@Test
	public void searchByString() throws Exception {
		// 搜索条件
		String queryString = "content:lucene";
		// String queryString = "全文 OR 用户";
		// String queryString = "全文  AND 用户";

		//把查询字符串转为Query对象
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] { "title", "content" },Configuration.getAnalyzer()); // 在title与content中查询
		Query query = queryParser.parse(queryString);

		//查询,得到中间结果
		IndexSearcher indexSearcher = new IndexSearcher(Configuration.getDirectory());
		TopDocs topDocs = indexSearcher.search(query, 100); // 按指定条件条询,只返回前n条结束
		ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 前n条结果的信息

		//处理结果
		List<Article> list = new ArrayList<Article>();
		for (int i = 0; i < scoreDocs.length; i++) {
			Document doc = indexSearcher.doc(scoreDocs[i].doc);
			list.add(ArticleDocumentUtils.document2Article(doc));
		}
		indexSearcher.close();

		//显示结果
		System.out.println("总结果数量为:" + list.size());
		for (Article article : list) {
			System.out.println("--------> id = " + article.getId());
			System.out.println("title  = " + article.getTitle());
			System.out.println("content= " + article.getContent());
		}
	}

	@Test
	public void searchByQuery() throws Exception {
		
		Query query = new TermQuery(new Term("title", "lucene"));
		// Query query = new TermQuery(new Term("content", "lucene"));
		System.out.println("对应的查询字符串为:" + query.toString());

		//查询,得到中间结果
		IndexSearcher indexSearcher = new IndexSearcher(Configuration.getDirectory());
		TopDocs topDocs = indexSearcher.search(query, 100); // 按指定条件条询,只返回前n条结束
		ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 前n条结果的信息

		//处理结果
		List<Article> list = new ArrayList<Article>();
		for (int i = 0; i < scoreDocs.length; i++) {
			Document doc = indexSearcher.doc(scoreDocs[i].doc);
			list.add(ArticleDocumentUtils.document2Article(doc));
		}
		indexSearcher.close();

		// 显示结果
		System.out.println("总结果数量为:" + list.size());
		for (Article article : list) {
			System.out.println("--------> id = " + article.getId());
			System.out.println("title  = " + article.getTitle());
			System.out.println("content= " + article.getContent());
		}
	}

	// 查询出所有文档
	@Test
	public void testMatchAllDocsQuery() {
		// 对应的查询字符串为:*:*
		Query query = new MatchAllDocsQuery();
		searchByQuery(query);
	}

	// 关键词查询
	@Test
	public void testTermQuery() {
		// 对应的查询字符串为:title:lucene
		Query query = new TermQuery(new Term("title", "lucene
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值