记一次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,通过实践发现用这个字段可以精确查询,分词器不会有影响。
将之前的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 - ✌🙄✌