由于业务需要,查询需求很多,这就导致一个需求就要写一个elasticsearch的java api查询方法,后来无意中发现了一个利用sql进行elasticsearch查询,而且用起来还算比较灵活,在这里分享给大家,如果有不对的地方,欢迎大家指正。
1、首先在项目的pom.xml文件增加jar包
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>2.3.5</version> </dependency> <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>delete-by-query</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.nlpcn</groupId> <artifactId>elasticsearch-sql</artifactId> <version>2.3.5.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.15</version> </dependency>
这里需要注意的是elasticsearch和elasticsearch-sql的版本需要一致,否则可能会报有的方法找不到的情况。
2、sql转换的公共方法(我这里的sql用的是mysql格式,其他DB格式还未验证)
/** * 根据表达式组装ES的query查询语句 * * @param indexName-索引名 * @param express-查询条件:(f1=2 and f2=1) or (f3=1 and f4=1) * @return */ public static QueryBuilder createQueryBuilderByWhere(String indexName, String whereExpress) { BoolQueryBuilder boolQuery = null; try { String sql = "select * from " + indexName; String whereTemp = ""; if (StringUtils.isNotBlank(whereExpress)) { whereTemp = " where " + whereExpress; } SQLQueryExpr sqlExpr = (SQLQueryExpr) toSqlExpr(sql + whereTemp); SqlParser sqlParser = new SqlParser(); MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) sqlExpr.getSubQuery().getQuery(); WhereParser whereParser = new WhereParser(sqlParser, query); Where where = whereParser.findWhere(); if (where != null) { boolQuery = QueryMaker.explan(where); } } catch (SqlParseException e) { LOGGER.warn("EsQueryUtil.createQueryBuilderByExpress-Exception", e); } return boolQuery; } /** * 验证sql * * @param sql sql查询语句 * @return */ private static SQLExpr toSqlExpr(String sql) { SQLExprParser parser = new ElasticSqlExprParser(sql); SQLExpr expr = parser.expr(); if (parser.getLexer().token() != Token.EOF) { throw new ParserException("illegal sql expr : " + sql); } return expr; }
3、简单的查询方法
/** * 查询数据总数 * * @param indexName 索引名称 * @param whereExpress 查询条件 * @return */ public static long searchTotalByApi(String indexName, String whereExpress) { try { // 获取Elasticsearch的服务 Client client = EsClientUtil.getEsServer(); // 转换Elasticsearch格式的查询条件 QueryBuilder queryBuilder = createQueryBuilderByWhere(indexName, whereExpress); // 减少资源消耗,只查询总数 long resultNum = client.prepareSearch(indexName).setQuery(queryBuilder).setFrom(0).setSize(0).execute() .actionGet().getHits().getTotalHits(); if (0 == resultNum) { LOGGER.info("EsQueryUtil.seatchTotalByApi-queryBuilder:{}", queryBuilder); } return resultNum; } catch (Exception e) { LOGGER.warn("EsQueryUtil.seatchTotalByApi-Exception{}", e); } return 0; }
相关推荐
"Java_使用SQL查询Elasticsearch.zip"这个压缩包内容可能包含了如何通过Java API使用SQL语句来查询Elasticsearch的相关教程和代码示例。以下将详细介绍这一主题的知识点。 首先,Elasticsearch虽然原生支持JSON格式...
标题中的“一款基于SQL查询ES的Java工具包”指的是一个Java库,专门设计用于通过SQL语句查询Elasticsearch(ES)数据存储。Elasticsearch是一个流行的开源搜索引擎和分析引擎,广泛应用于日志分析、实时分析等领域。...
**基于ESAPI的防SQL注入技术** 在网络安全领域,SQL注入是一种常见的攻击手段,通过恶意构造SQL语句,攻击者可以获取、修改甚至删除数据库中的敏感数据。为了防止这种攻击,开发人员通常会采用各种防御策略,其中一...
4. **性能和效率**:虽然Elasticsearch原本设计为一个分布式搜索和分析引擎,但通过Elasticsearch SQL,开发者可以利用SQL的优化器来提高查询效率,同时避免了转换SQL到Elasticsearch REST API的额外开销,进一步...
Elasticsearch SQL是将SQL查询语句引入到Elasticsearch中的一个插件,它使得习惯于使用SQL的用户能够更加方便地与Elasticsearch进行交互。这个"elasticsearch-sql-7.9.2.0(maven包)"是针对Elasticsearch 7.9.2版本的...
Elasticsearch查询客户端是用于与ES服务器通信的软件,它们提供了多种语言的API,允许开发者以编程方式执行索引、搜索、更新和删除等操作。常见的Elasticsearch客户端包括: - **Jest**:一个轻量级的Java REST...
Elasticsearch Java API是Elasticsearch提供的官方客户端之一,允许开发者通过Java代码来操作Elasticsearch,提供了一个更为便捷和安全的方式来与Elasticsearch集群交互。 入门Elasticsearch时,首先应该熟悉...
在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...
Elasticsearch SQL插件是为Elasticsearch设计的一个强大工具,允许用户通过熟悉的SQL语句来查询、管理和操作Elasticsearch的数据。版本6.2.4.0是这个插件的一个特定发行版,旨在提供更简便的方式来访问和分析存储在...
Elasticsearch-Sql是针对Elasticsearch的一个非常实用的组件,它允许用户通过SQL查询语句来操作Elasticsearch的数据,极大地降低了Elasticsearch的使用门槛,尤其是对于那些熟悉SQL语法但对Elasticsearch API不熟悉...
也可以考虑集成到现有的日志分析工具,如ELK(Elasticsearch、Logstash、Kibana)栈。 9. **性能优化**: 大规模日志处理时,要注意性能优化,比如批量读取文件、使用多线程并行处理等。 10. **源码和工具**: ...
在描述中提到,“es+springboot+mysql 实现mysql数据同步es,然后查询es数据各种demo实现”,这表明项目旨在实现在MySQL数据库和Elasticsearch之间进行数据同步,同时提供了查询Elasticsearch数据的各种示例代码。...
ESAPI(Enterprise Security API)是Enterprise Security API的缩写,是一个开源的安全库,主要用于Java应用程序,旨在提供一种标准的方法来处理常见的安全问题,如输入验证、输出编码、身份验证、授权、加密等。...
ESAPI (Enterprise Security API) 是一个开源项目,由OWASP(Open Web Application Security Project)组织维护,旨在提供一套全面的、统一的安全编程接口,帮助Java开发者编写更安全的应用程序。这个压缩包“esapi-...
在这个名为“人工智能-项目实践-检索引擎-基于Java8的SSM+Elasticsearch全文检索的个人博客系统”的项目中,开发者构建了一个集成了人工智能技术的个人博客系统,它利用了现代搜索引擎技术,特别是Elasticsearch,来...
可以使用Elasticsearch的Java API来构建DSL。 5. **执行查询和结果映射**:在代理类中,使用ES的Java REST客户端执行DSL查询,并将结果映射到相应的Java对象。可以自定义结果映射逻辑,以适应不同的返回类型。 6. ...
4. **查询API**:利用Elasticsearch的Java API进行查询,可以执行简单的关键词匹配,也可以进行复杂的多条件组合查询、模糊搜索、短语匹配等。 5. **结果排序**:根据相关性或自定义权重对搜索结果进行排序。...
当调用`searchByKeyword`方法时,插件会读取XML中的`<es:query>`,解析DSL,然后通过Elasticsearch Java API发送请求并处理返回的结果。 需要注意的是,Elasticsearch查询DSL的灵活性远超SQL,因此在映射过程中可能...
为了方便开发者利用传统SQL语法进行查询操作,Elasticsearch引入了X-Pack SQL JDBC驱动,它使得Elasticsearch能够与Java应用程序通过JDBC(Java Database Connectivity)接口进行交互。本文将深入探讨X-Pack SQL ...