Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码

ops/2024/11/25 19:59:11/

前言

本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01

接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码

如何在指定范围内查询。从lucene 7 开始,filter 被弃用,导致无法进行调节过滤。

TermInSetQuery 指定集合条件过滤

如图,想要设定fromType为CSDN和小米,不需要查询其他来源的文字该怎么办?
在这里插入图片描述

前文提到的TermRangeQuery 属于数值范围的条件,这里显然不适用。

TermRangeQuery query2  = new TermRangeQuery("id", new BytesRef("1001".getBytes()), new BytesRef("1005".getBytes()), true, true);builder.add(query2, BooleanClause.Occur.MUST);

我们需要使用TermInSetQuery

        List<BytesRef> bytesRefList = Arrays.asList(new BytesRef("CSDN".getBytes()),new BytesRef("小米".getBytes()));TermInSetQuery query3 = new TermInSetQuery("fromType",bytesRefList);builder.add(query3, BooleanClause.Occur.MUST);

多关键词在多字段中搜索

//多条件查询构造BooleanQuery.Builder builder = new BooleanQuery.Builder();//        // 条件一
//        MultiFieldQueryParser parser = new MultiFieldQueryParser(str, new IKAnalyzer());// 创建查询对象
//        Query query = parser.parse(text);
//        builder.add(query, BooleanClause.Occur.MUST);BooleanQuery.Builder builder2 = new BooleanQuery.Builder();//这里很重要,必须单独构建一个query,相当于预设一个括号,把几个关键词放到括号里for (String key : text.split(",")) {String fields[] = {"title", "description"};//在标题和描述中搜索String kws[] = {key, key};BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};Query queryKey = MultiFieldQueryParser.parse(kws, fields, flags, new IKAnalyzer()); //通常就是关键词搜索if (rule.equals("and")) { // and 或者 orbuilder2.add(queryKey, BooleanClause.Occur.MUST); //相当于各关键词之间的关系是AND} else {builder2.add(queryKey, BooleanClause.Occur.SHOULD); /// 相当于各关键词之间的关系是OR}}builder.add(builder2.build(), BooleanClause.Occur.MUST);

完整示例

 /**** @param text  关键词,多关键词逗号分割* @param rule 规则, 多关键词之间的关系是and 还是or* @return* @throws IOException* @throws ParseException* @throws InvalidTokenOffsetsException*/@GetMapping("/searchTextMoreParam")public List<BlogTitle> searchTextMoreParam(String text,String rule) throws IOException, ParseException, InvalidTokenOffsetsException {String[] str = {"title", "description"};Directory directory = FSDirectory.open(FileSystems.getDefault().getPath("d:\\indexDir"));// 索引读取工具IndexReader reader = DirectoryReader.open(directory);// 索引搜索工具IndexSearcher searcher = new IndexSearcher(reader);//多条件查询构造BooleanQuery.Builder builder = new BooleanQuery.Builder();//        // 条件一
//        MultiFieldQueryParser parser = new MultiFieldQueryParser(str, new IKAnalyzer());// 创建查询对象
//        Query query = parser.parse(text);
//        builder.add(query, BooleanClause.Occur.MUST);BooleanQuery.Builder builder2 = new BooleanQuery.Builder();//这里很重要,必须单独构建一个query,相当于预设一个括号,把几个关键词放到括号里for (String key : text.split(",")) {String fields[] = {"title", "description"};String kws[] = {key, key};BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};Query queryKey = MultiFieldQueryParser.parse(kws, fields, flags, new IKAnalyzer()); //通常就是关键词搜索if (rule.equals("and")) { //builder2.add(queryKey, BooleanClause.Occur.MUST); //相当于各关键词之间的关系是AND} else {builder2.add(queryKey, BooleanClause.Occur.SHOULD); /// 相当于各关键词之间的关系是OR}}builder.add(builder2.build(), BooleanClause.Occur.MUST);// 条件二// TermQuery不使用分析器所以建议匹配不分词的Field域(StringField, )查询,比如价格、分类ID号等。这里只能演示个ID了。。。
//        Query termQuery = new TermQuery(new Term("id", "1001"));
//        builder.add(termQuery, BooleanClause.Occur.MUST);//        TermRangeQuery query2  = new TermRangeQuery("id", new BytesRef("1001".getBytes()), new BytesRef("1005".getBytes()), true, true);
//        builder.add(query2, BooleanClause.Occur.MUST);List<BytesRef> bytesRefList = Arrays.asList(new BytesRef("CSDN".getBytes()),new BytesRef("小米".getBytes()));TermInSetQuery query3 = new TermInSetQuery("fromType",bytesRefList);builder.add(query3, BooleanClause.Occur.MUST);// 获取前十条记录TopDocs topDocs = searcher.search(builder.build(), 100);// 获取总条数log.info("本次搜索共找到" + topDocs.totalHits + "条数据");//高亮显示SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(builder2.build()));//高亮只是关键词,其他属于过滤条件//高亮后的段落范围在100字内Fragmenter fragmenter = new SimpleFragmenter(100);highlighter.setTextFragmenter(fragmenter);// 获取得分文档对象(ScoreDoc)数组.SocreDoc中包含:文档的编号、文档的得分ScoreDoc[] scoreDocs = topDocs.scoreDocs;List<BlogTitle> list = new ArrayList<>();for (ScoreDoc scoreDoc : scoreDocs) {// 取出文档编号int docId = scoreDoc.doc;// 根据编号去找文档Document doc = reader.document(docId);BlogTitle content = selectById(doc.get("id"));//处理高亮字段显示String title = highlighter.getBestFragment(new IKAnalyzer(), "title", doc.get("title"));if (title == null) {title = content.getTitle();}String description = highlighter.getBestFragment(new IKAnalyzer(), "description", content.getDescription());content.setDescription(description);content.setTitle(title);list.add(content);}return list;}

http://www.ppmy.cn/ops/136655.html

相关文章

cookie反爬----普通服务器,阿里系

目录 一.常见COOKIE反爬 普通&#xff1a; 1. 简介 2. 加密原理 二.实战案例 1. 服务器响应cookie信息 1. 逆向目标 2. 逆向分析 2. 阿里系cookie逆向 1. 逆向目标 2. 逆向分析 实战&#xff1a; 无限debugger原理 1. Function("debugger").call() 2. …

postman 调用 下载接口(download)使用默认名称(response.txt 或随机名称)

官网地址&#xff1a;https://www.postman.com 介绍 Postman 是一款流行的 API 开发和测试工具&#xff0c;用于发送 HTTP 请求、测试接口、调试服务器响应以及进行 API 文档管理。它支持多种请求类型&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并且功能…

微信小程序技术架构图

一、视图层1.WXML&#xff08;WeiXin Markup Language&#xff09; 这是微信小程序的标记语言&#xff0c;类似于 HTML。它用于构建小程序的页面结构。例如&#xff0c;通过标签来定义各种视图元素&#xff0c;如<view>&#xff08;类似于 HTML 中的<div>&#xff…

ceph 18.2.4二次开发,docker镜像制作

编译环境要求 #需要ubuntu 22.04版本 参考https://docs.ceph.com/en/reef/start/os-recommendations/ #磁盘空间最好大于200GB #内存如果小于100GB 会有OOM的情况发生,需要重跑 目前遇到内存占用最高为92GB替换阿里云ubuntu 22.04源 将下面内容写入/etc/apt/sources.list 文件…

冒泡排序(Java)

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历要排序的列表&#xff0c;比较相邻的元素并交换它们的位置&#xff0c;直到整个列表排序完成。冒泡排序的名称来源于越小的元素会经由交换慢慢“浮”到数列的顶端。 原理 比较相邻的…

GPU服务器厂家:科研服务器领域机遇与博弈,AMD 新UDNA 架构

科研服务器作为推动科学研究进步的核心基础设施&#xff0c;其性能与架构的创新对于整个科研生态有着极为关键的影响。AMD 全新推出的 UDNA 架构&#xff0c;引发了广泛的关注与讨论。 AMD UDNA 架构于科研服务器的产品数据与市场格局 AMD 在计算机硬件领域的影响力持续攀升&a…

使用ENSP实现默认路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…

从零开始学习数据库 day0(基础)

在当今的信息时代&#xff0c;数据已经成为了企业和组织最重要的资产之一。无论是电子商务平台&#xff0c;社交媒体&#xff0c;还是科研机构&#xff0c;几乎每个地方都离不开数据库。今天&#xff0c;我们将一起走进数据库的世界&#xff0c;学习它的基础知识&#xff0c;帮…