记一次springboot+elasticsearch+mongodb查询的使用

记一次springboot+elasticsearch+mongodb查询的使用

  • springboot:2.3.5
  • es:7.10.1
  • mongodb:4.4x
  • elasticsearch部署:参考其他教程
  • 源数据:使用的mongodb,因为mongodb查询太慢所以使用es
  • elasticsearch同步mongodb数据:使用monstache
    – 注:由于资源有限,es和mongodb都放在同一台服务器上了,所以monstache的es地址设置成http://127.0.0.1:9200,(一开始没写http导致一直报错es服务器找不到node)部署在一台服务器上其实没什么用,就是馋es的搜索功能。
  • 同步之后,服务器上启动了mongodb和es服务
  • springboot项目中使用elasticsearch,参考其他教程
  • 官方文档中推荐的是使用resthighlevelclient,这个的使用也有教程,但是参考官方文档比较好,官方文档对于hlc的讲解也比较详细
    –https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.10/java-rest-high-search.html
    –主要是构建query,client.search,再对searchResponse进行处理
  • 数据的对象处理参考其他教程
  • search之后得到map,转化为java对象使用到了jackson工具类(最开始想直接set属性,但是map还得判断是否为null,之后使用阿里的fastjson但是效果一般,偶尔报错,最后考虑jackson,确实nb)
  • 贴一段代码,分享一下模糊查询和匹配查询
SearchRequest searchRequest = new SearchRequest("project.paper");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
       
       //分页操作
        searchSourceBuilder.from(pagenum*20);
        searchSourceBuilder.size(20);
       
        //设置超时
        searchSourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
        searchRequest.source(searchSourceBuilder);
       
        //构建一个querybuilder
        MatchQueryBuilder matchQueryBuilder = 
        new MatchQueryBuilder("authors.name", name).fuzziness(Fuzziness.AUTO).maxExpansions(3);
        searchSourceBuilder.query(matchQueryBuilder);
       
       //获取response
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        return searchResponse;

我的理解是,querybuilder为查询的方式,即如何查询

这里的MatchQueryBuilder是模糊匹配查询,用了ik分词器后模糊粒度还是很大。

想要做到通过单词“keyword”查询到“a test keyword”这个字段的词,还得用MatchPhraseBuilder,但是如果想要完全匹配,这个方法还是不行,因为查询的关键字只要属于字段就会被返回。

实在想要实现精确匹配查询,之后考虑了TermQueryBuilder,但是由于某种原因没有成功返回数据,最后也没有心情去追查原因。

最后实现了精确匹配,在用kibana玩耍的时候,发现es的数据中,每个字段有两个值,比如之前代码中的author.name,还存在另一个字段author.name.keyword,通过实践发现用这个字段可以精确查询,分词器不会有影响。
kibana截图

将之前的QueryBuilder的查询字段改为name.keyword

MatchPhraseQueryBuilder matchQueryBuilder = 
        new MatchPhraseQueryBuilder("authors.name.keyword", name);

具体原因暂时没想要弄懂,不过这个keyword的效果应该和将字段的type变成keyword是一样的,但是又想使用text的分词功能,所以有点矛盾,至于换成MatchQuery之后效果是否一样也没时间探究了,但是精确查询这一块,查了很多教程也没有什么进展,最后偶然发现,还是很有感触的。

  • 最后:es7.10教程还是很少,大多只能参考官方文档,好在这次只是使用了查询功能,没有很复杂,关于es多节点部署暂时没有尝试,只是想着先实现功能。
  • monstache参考:
    – https://blog.csdn.net/qq_28119741/article/details/109613212
    – 阿里云文档:https://help.aliyun.com/document_detail/171650.html
  • ✌🙄✌
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
【毕业设计】基于springboot的仿共享单车后台源码及笔【源码+SQL脚本】.zip 一个基于springboot的类似于共享单车的后台系统,包括手机号码注册、登陆、定位、骑行轨迹和消息推送等功能 技术栈: SpringBoot SpringMVC Mybatis(基础框架) Mysql springSecurity(权限验证和请求拦截) AES对称加密数据,RSA非对称加密公钥key(对用户信息进行加密) redis缓存token(token作为用户的标识,维护用户的状态,类似于session) redis结合ActiveMQ发送短信验证码和防止恶意短信无限发送 整合云存储,保存头像(七牛云对象存储为例) 整合mongodb获取附近单车以及距离,主要是geoHash算法(重点) 百度云推送的实战-通知开锁 锁车之后的一系列操作(订单、消费、锁车,支付没有做) 骑行轨迹的保存(保存在mongodb中) 其他:logback,lombok,fastjson, 全局异常和高复用状态类封装、 利用mysql主键自增特性实现单车连续编号 学习这个项目的时候,对其思路做了笔,我这里按照自己的写法,与其略有不同, 但是基本思路都是一样的。 注意: 本机环境是jdk8,tomcat8,mysql5.7.13,windows下,IDE是IntelliJ IDEA, mongodb(mongodb-win32-x86_64-2008plus-v3.2-latest),redis(redis64-3.0.501), activeMq(apache-activemq-5.15.2) api测试工具为Postman,还用了mongodb客户端Robo 3T,redis客户端工具RedisDesktopManage 跑这个代码之前,需要准备好数据库,开启redis、mongodb、activeMQ服务。 需要注册自己的七牛云账号(上传头像)、秒嘀账号(发送短信验证码)、百度云推送账号

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值