网站论坛建设需要什么资质,钓鱼网站怎么搭建,广饶网站建设,做网站需要注意的事项目录
问题背景
解决方案
编写es的mapper
动态dsl编写
使用mapper获取动态dsl
远程调用restful api查询 问题背景
在大数据量的业务系统中#xff0c;一般都会引入Elasticsearch来作为搜索引擎#xff0c;而搜索的条件又是多种多样的。回顾下#xff0c;如果是mysql等…目录
问题背景
解决方案
编写es的mapper
动态dsl编写
使用mapper获取动态dsl
远程调用restful api查询 问题背景
在大数据量的业务系统中一般都会引入Elasticsearch来作为搜索引擎而搜索的条件又是多种多样的。回顾下如果是mysql等这种关系型数据库来作为存储介质呢我们是不是可以通过mybatis的动态sql解析功能就能轻轻松松的搞定。
或许你也许会问es不是提供了java版本的sdk么通过sdk可以动态的构建dsl语句的确实如此不过这样的可读性远远没有将dsl放在xml中可以看下在java代码中操作es的代码案例
public static void main(String[] args) throws IOException {// 初始化RestHighLevelClientRestClientBuilder builder RestClient.builder(new HttpHost(localhost, 9200, http));RestHighLevelClient client new RestHighLevelClient(builder);// 创建查询条件SearchSourceBuilder searchSourceBuilder new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchQuery(fieldname, value)); // 动态查询字段名和值// 创建搜索请求SearchRequest searchRequest new SearchRequest(indexname); // 指定索引名searchRequest.source(searchSourceBuilder);// 执行搜索SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);// 处理搜索结果SearchHits hits searchResponse.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}// 关闭客户端client.close();}
mybatis的执行流程中就是通过SqlSessionFactory创建SqlSession有了SqlSession可以开始执行sql执行sql的时候会将动态的sql转成一个MappedStatement通过这个可以创建BoundSql我们是不是可以利用mybatis执行mysql的一部分功能拿到BoundSql然后通过http的方式直接远程调用es查询
答案是可行的
解决方案
编写es的mapper
package com.tml.mouseDemo.mapper;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;Mapper
public interface ESMapper {String queryOrderById(Param(name) String name, Param(id) String id);
}动态dsl编写
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.tml.mouseDemo.mapper.ESMapperselect idqueryOrderById resultTypestring{query:{bool:[term:{id:${id}}if testname!null,term:{name:${name}}/if]}}/select
/mapperdsl的语法就不多介绍了在这个xml文件中可以使用mybatis的if when choose foreach等诸多标签通过这些个标签的组合你可以编写多条件检索的复杂dsl
使用mapper获取动态dsl Testpublic void testEs() {MapString, String map new HashMap();map.put(name, tml);map.put(id, hello world);BoundSql bSql sessionFactory.getConfiguration().getMappedStatement(queryOrderById).getBoundSql(map);log.info(bSql:{}, bSql.getSql());
}
其中sessionFactory是通过spring的自动注入的
Autowired
private SqlSessionFactory sessionFactory;
远程调用restful api查询
拿到dsl以后就可以通过http远程调用restful api拿到结果了通过httpClient或者是RestTemplate实现都行这里就不赘述了。