JPA的注解@Field指定为Keyword失败,导致查询不到数据

news2024/9/28 8:02:48

一、背景

使用 jpa 对es操作,查询条件不生效,需求是批量查询课程编号。说白了,就是一个In集合的查询。在es里,如果是精准匹配是termQuery,比如:

  • queryBuilder.filter(QueryBuilders.termQuery(“schoolId”, schoolId))
    而批量查询则是:
  • queryBuilder.filter(QueryBuilders.termsQuery(“schoolId”, schoolIds));

可以说,它们的区别仅仅在后者多了一个s(复数)。

不生效的原因,反复对比了好久,也没有看出有什么问题,因为代码太简单了。

我把拼接好的语句,在IDE工具(es-head、Kibana、ElisticHD)把查询条件验证,发现也是查询不到数据。

说明,不是java代码的问题,而是数据存储的问题了。

下面,我先把代码摘除一部分来,然后对es的索引信息重点分析,最后给出了我个人的解决方案。

二、代码摘引

1、model

import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

@Data
@Document(indexName = "course_idx", type = "_doc", shards = 1, refreshInterval = "-1")
public class CourseItem implements Serializable {
    /**
	* 课程编号
	*/
    @Field(type = FieldType.Keyword)
    private String courseNo;
}

2、检索的条件匹配

检索的要求是:批量查询课程编号,传入的是多个课程编号集合。这里是在拼接es检索条件。

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

@Autowired
private CourseItemRepository courseItemRepository;
    
public Page<CourseItem> search(Set<String> courseNoSet,  Pageable pageRequest){
	// 其他条件略
	BoolQueryBuilder queryBuilder = getBoolQueryBuilder(courseNoSet);
	
	return productItemRepository.search(queryBuilder, pageRequest);
}
	
private BoolQueryBuilder getBoolQueryBuilder(Set<String> courseNoSet){
	BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
	
	if (!CollectionUtils.isEmpty(courseNoSet)) {
	    queryBuilder.filter(QueryBuilders.termsQuery("courseNo", courseNoSet));
	}
	return queryBuilder;
}

3、CourseItemRepository.java

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface CourseItemRepository extends ElasticsearchRepository<CourseItem, String> {
}

三、代码自动生成的索引

在这里插入图片描述
可以看到,这个字段的类型不是keyword,实际自动生成的类型是text。

 "courseNo":{
    "type":"text",
    "fields":{
        "keyword":{
            "ignore_above":256,
            "type":"keyword"
        }
    }
}

通常,这是由于 Elasticsearch 的自动类型推断机制所导致的。Elasticsearch 在某些情况下会根据数据的内容和用途来自动确定字段的类型,而忽略了显式的映射。

四、显式字段映射

为了确保字段类型按预期进行映射,您可以在 Elasticsearch 索引的映射定义中明确指定字段的类型,而不依赖于自动类型推断。这样可以确保字段始终具有所需的类型,无论数据内容如何。
在这里插入图片描述

// 在kibana dev tools手动创建索引,下面是简略的一个json。
// 注意courseNo的类型我手动指定为keyword
// name字段还是text类型,以支持分词检索。
// id字段也像courseNo一样,手动指定为keyword类型

PUT course_idx_dev
{
    "mappings":{
        "_doc":{
            "properties":{
                "courseType":{
                    "type":"long"
                },
                "courseNo":{
                    "type":"keyword"
                },
                "name":{
                    "type":"text",
                    "fields":{
                        "keyword":{
                            "ignore_above":256,
                            "type":"keyword"
                        }
                    }
                },
                "id":{
                    "type":"keyword"
                }
            }
        }
    }
}
  • text类型的name字段,它的检索条件拼接示例是
// keywords是输入内容
QueryBuilders.functionScoreQuery(
     QueryBuilders.matchPhraseQuery("name", keywords), ScoreFunctionBuilders.weightFactorFunction(1000))
     .scoreMode(FunctionScoreQuery.ScoreMode.SUM)
     .setMinScore(10.0F);

通过下图可以看出,courseNo的类型已纠正过来了。
在这里插入图片描述

五、总结

至此,我们对courseNo的批量查询也就生效了。
本文通过一个查询需求,揭示出了text和keyword的显著差异,如果你也遇到查询不生效的问题,希望可以帮助到你。
es还有许多类型,除了基本类型外,还有Nested和Object,在相应的场景下使用它们,可以让你的代码变得更加优雅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】路由与Node.js下载安装及环境配置教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

Python之列表

标题 列表什么是列表列表的创建列表的删除列表的访问 列表的常用方法append()、insert()、extend()pop()、remove()、clear()count()、index() 列表支持的运算加法运算符乘法运算符*成员测试运算符in 内置函数对列表的操作列表推导式 切片操作&#xff08;1&#xff09;使用切片…

手机直播录屏软件哪家好?看这篇就够了!

随着智能手机的普及&#xff0c;移动互联网的飞速发展&#xff0c;手机直播和录屏已成为人们在日常生活中不可或缺的一部分。手机直播和录屏软件的广泛应用&#xff0c;满足了人们日常工作、学习、娱乐等各方面的需求。本文将介绍两款手机直播录屏软件&#xff0c;并通过分步骤…

最小二乘法预测波士顿房价

首先导入所需要的库 import sklearn import matplotlib.pyplot as plt from matplotlib import font_manager from matplotlib import rcParams from sklearn.datasets import load_boston from sklearn import linear_model from sklearn.model_selection import train_test_…

el-input-number 添加单位

效果&#xff1a; 数字长的时候也不会遮挡后面单位 1、使用css&#xff0c;代码 <el-form-itemlabel"功率 "><el-row><el-col :span"4"><el-switchv-model"formData.powerEnable":active-value"1":inactive-v…

反转单链表

思路图1&#xff1a; 代码&#xff1a; struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…

【解刊】IEEE旗下Trans系列,中科院1区TOP,国人占比79.388%排名第一!(附IEEE名单)

计算机领域 • 好刊解读 IEEE Transactions on Cybernetics 出版社&#xff1a;IEEE ISSN&#xff1a;2168-2267 eISSN&#xff1a;2168-2275 检索数据库&#xff1a;SCIE&EI 双检 数据库检索年份&#xff1a;2013年 出刊频率&#xff1a;月刊&#xff0c;一年一卷&…

python之读写.docx文件实例

.docx文件是一种由Microsoft Word处理的二进制文件格式&#xff0c;取代了早期版本的.doc格式。它包含文本、图像、表格和其他文档元素&#xff0c;并用于Microsoft Office Word 2007及更高版本。 .docx文件通常使用Office Open XML标准&#xff08;ISO/IEC 29500&#xff09;…

Python爬虫从端到端抓取网页

网页抓取和 REST API 简介 网页抓取是使用计算机程序以自动方式从网站提取和解析数据的过程。这是创建用于研究和学习的数据集的有用技术。虽然网页抓取通常涉及解析和处理 HTML 文档&#xff0c;但某些平台还提供 REST API 来以机器可读格式&#xff08;如 JSON&#xff09;检…

平面设计找素材就上这6个网站

平面设计师找素材就上这6个网站&#xff0c;免费下载&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/?vNTYxMjky 菜鸟图库是一个非常大的素材库&#xff0c;站内包含设计、办公、自媒体、图片、电商等各行业素材。网站还为新手设计师提供免费的素材…

使用sersync实现数据实时同步

使用sersync实现数据实时同步 sersync诞生过程部署前提配置rsync部署sersync配置sersync的path变量 修改sersync配置文件sersync常用参数使用服务文件实现开机自启动实时同步服务debug sersync诞生过程 sersync作者&#xff1a;前金山公司周洋(花椒直播&#xff09; 数据实时同…

(leetcode)二叉树最大深度

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 图解&#xff1a; 题目&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数…

数据挖掘十大算法

参考&#xff1a; ICDM&#xff1a;数据挖掘十大算法

go语言 实现正向代理

正向代理 我们无法访问外网 就需要VPN 这里的VPN相当于是一个代理服务器&#xff0c;我们将请求的数据给代理服务器&#xff0c;让代理帮我们转发并接收请求消息 代码 package mainimport ("fmt""io""net""net/http""strings&…

华为分布式新核心全面升级金融级PaaS能力:数字化时代“分工”再深化

文 | 螳螂观察 作者 | 李永华 金融领域一向是数字化转型升级最难啃的硬骨头&#xff0c;无数厂商在此深耕&#xff0c;但由于行业数字化需求复杂而艰深&#xff0c;实现深入突破的并不多&#xff0c;尤其是在关系到账户数据的核心系统方面&#xff0c;有所建树的少之又少。 …

Python日期处理库:掌握时间的艺术

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 日期和时间在计算机编程…

短剧推广和小说推文在哪里授权介绍

短剧推广和小说推文都属于很热门的赛道&#xff0c;都可以通过“巨量推文”进行授权 在巨量推文找到想推广的小说或者短剧后申请推广即可&#xff0c;小说需要有回填作品信息&#xff0c;短剧为全自动&#xff0c;出数据后实时同步到平台

Maven高级---分模块设计,继承(继承关系/版本锁定/自定义属性)

目录 分模块设计 继承与聚合 继承关系 ​案例​ 版本锁定 自定义属性/引用属性 分模块设计 把一个项目拆分成不同的模块 我们可以把原来一个项目包中的东西单独提出来作为一个模块,也是解耦的思想 然后我们可以通过引入依赖的方式将这两个模块引入,如下 继承与聚合 继…

JavaScript小案例-树形菜单(菜单数据为数组)

菜单层级理论上可以无限多&#xff0c;因为是递归渲染。 gif演示图&#xff1a; 代码&#xff1a; 树形菜单.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&quo…

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一著辉少许

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一著辉少许