`
Shilaike
  • 浏览: 10935 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java API利用SQL查询Elasticsearch

 
阅读更多

由于业务需要,查询需求很多,这就导致一个需求就要写一个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_使用SQL查询Elasticsearch.zip"这个压缩包内容可能包含了如何通过Java API使用SQL语句来查询Elasticsearch的相关教程和代码示例。以下将详细介绍这一主题的知识点。 首先,Elasticsearch虽然原生支持JSON格式...

    一款基于SQL查询ES的Java工具包,支持SQL解析DSL,支持JDBC驱动,支持和Mybatis、Spring集成.zip

    标题中的“一款基于SQL查询ES的Java工具包”指的是一个Java库,专门设计用于通过SQL语句查询Elasticsearch(ES)数据存储。Elasticsearch是一个流行的开源搜索引擎和分析引擎,广泛应用于日志分析、实时分析等领域。...

    基于ESAPI的防sql注入jar包及使用示例.rar

    **基于ESAPI的防SQL注入技术** 在网络安全领域,SQL注入是一种常见的攻击手段,通过恶意构造SQL语句,攻击者可以获取、修改甚至删除数据库中的敏感数据。为了防止这种攻击,开发人员通常会采用各种防御策略,其中一...

    elasticsearch sql支持增删改查且支持mybatis集成

    4. **性能和效率**:虽然Elasticsearch原本设计为一个分布式搜索和分析引擎,但通过Elasticsearch SQL,开发者可以利用SQL的优化器来提高查询效率,同时避免了转换SQL到Elasticsearch REST API的额外开销,进一步...

    ES查询客户端,elasticsearch可视化工具 elasticsearch查询客户端

    Elasticsearch查询客户端是用于与ES服务器通信的软件,它们提供了多种语言的API,允许开发者以编程方式执行索引、搜索、更新和删除等操作。常见的Elasticsearch客户端包括: - **Jest**:一个轻量级的Java REST...

    elasticsearch-sql-7.9.2.0(maven包)

    Elasticsearch SQL是将SQL查询语句引入到Elasticsearch中的一个插件,它使得习惯于使用SQL的用户能够更加方便地与Elasticsearch进行交互。这个"elasticsearch-sql-7.9.2.0(maven包)"是针对Elasticsearch 7.9.2版本的...

    Elasticsearch API

    Elasticsearch Java API是Elasticsearch提供的官方客户端之一,允许开发者通过Java代码来操作Elasticsearch,提供了一个更为便捷和安全的方式来与Elasticsearch集群交互。 入门Elasticsearch时,首先应该熟悉...

    项目实战——Spark将Hive表的数据写入ElasticSearch(Java版本)

    在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...

    elasticsearch-sql-6.2.4.0.zip

    Elasticsearch SQL插件是为Elasticsearch设计的一个强大工具,允许用户通过熟悉的SQL语句来查询、管理和操作Elasticsearch的数据。版本6.2.4.0是这个插件的一个特定发行版,旨在提供更简便的方式来访问和分析存储在...

    基于Java Rest High Level Client的Elasticsearch-Sql组件【stalled】.zip

    Elasticsearch-Sql是针对Elasticsearch的一个非常实用的组件,它允许用户通过SQL查询语句来操作Elasticsearch的数据,极大地降低了Elasticsearch的使用门槛,尤其是对于那些熟悉SQL语法但对Elasticsearch API不熟悉...

    基于Java8的SSM+Elasticsearch全文检索的个人博客系统.zip

    4. **查询API**:利用Elasticsearch的Java API进行查询,可以执行简单的关键词匹配,也可以进行复杂的多条件组合查询、模糊搜索、短语匹配等。 5. **结果排序**:根据相关性或自定义权重对搜索结果进行排序。...

    java提取并分析sqlserver的日志

    也可以考虑集成到现有的日志分析工具,如ELK(Elasticsearch、Logstash、Kibana)栈。 9. **性能优化**: 大规模日志处理时,要注意性能优化,比如批量读取文件、使用多线程并行处理等。 10. **源码和工具**: ...

    springboot+elasticsearch

    在描述中提到,“es+springboot+mysql 实现mysql数据同步es,然后查询es数据各种demo实现”,这表明项目旨在实现在MySQL数据库和Elasticsearch之间进行数据同步,同时提供了查询Elasticsearch数据的各种示例代码。...

    esapi配置文件

    ESAPI(Enterprise Security API)是Enterprise Security API的缩写,是一个开源的安全库,主要用于Java应用程序,旨在提供一种标准的方法来处理常见的安全问题,如输入验证、输出编码、身份验证、授权、加密等。...

    esapi-java-legacysource-esapi-2.1.0.1.zip

    ESAPI (Enterprise Security API) 是一个开源项目,由OWASP(Open Web Application Security Project)组织维护,旨在提供一套全面的、统一的安全编程接口,帮助Java开发者编写更安全的应用程序。这个压缩包“esapi-...

    mybatis方式elasticsaerch的sql

    当调用`searchByKeyword`方法时,插件会读取XML中的`&lt;es:query&gt;`,解析DSL,然后通过Elasticsearch Java API发送请求并处理返回的结果。 需要注意的是,Elasticsearch查询DSL的灵活性远超SQL,因此在映射过程中可能...

    人工智能-项目实践-检索引擎-基于Java8的SSM+Elasticsearch全文检索的个人博客系统

    在这个名为“人工智能-项目实践-检索引擎-基于Java8的SSM+Elasticsearch全文检索的个人博客系统”的项目中,开发者构建了一个集成了人工智能技术的个人博客系统,它利用了现代搜索引擎技术,特别是Elasticsearch,来...

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    可以使用Elasticsearch的Java API来构建DSL。 5. **执行查询和结果映射**:在代理类中,使用ES的Java REST客户端执行DSL查询,并将结果映射到相应的Java对象。可以自定义结果映射逻辑,以适应不同的返回类型。 6. ...

    x-pack-sql-jdbc.rar

    为了方便开发者利用传统SQL语法进行查询操作,Elasticsearch引入了X-Pack SQL JDBC驱动,它使得Elasticsearch能够与Java应用程序通过JDBC(Java Database Connectivity)接口进行交互。本文将深入探讨X-Pack SQL ...

Global site tag (gtag.js) - Google Analytics