跳到主要内容

查询操作

dbVisitor 将 HTTP 方法 + 路径 + JSON 作为可执行语句。@Query 中也可以写 REST 命令,并不要求 SELECT。以下示例使用 Elasticsearch 7 的无类型请求。 连接配置见 JDBC Elasticsearch.

实体映射

@Table("user_info")
public class UserInfo {
@Column(primary = true)
private String uid;
private String name;
// 省略 getter 和 setter
}

索引名和字段名的大小写规则见名称敏感性

精确匹配

示例索引需将 uidname 定义为 keyword

PUT /user_info {"mappings":{"properties":{"uid":{"type":"keyword"},"name":{"type":"keyword"}}}}

构造器 eq 生成 match 查询。对 text 字段,它可能匹配分词后的内容;需要精确匹配时,使用 keyword 字段及下面的 term 请求。

执行查询命令

JdbcTemplate jdbc = new JdbcTemplate(dataSource);

List<UserInfo> rows = jdbc.queryForList(
"POST /user_info/_search {\"query\":{\"term\":{\"uid\": ?}}}",
new Object[] { "1001" }, UserInfo.class);

通过不同 API 查询

LambdaTemplate lambda = new LambdaTemplate(dataSource);
UserInfo item = lambda.query(UserInfo.class)
.eq(UserInfo::getUid, "1001")
.queryForObject();

构造器查询生成 _search 请求。

读取脚本计算结果

ES 6/7 在搜索请求中使用 Painless 的 script_fields,不是调用存储函数。以下例子要求 calculation 索引中至少有一条文档:

String command = """
POST /calculation/_search
{"size": 1, "_source": false, "query": {"match_all": {}},
"script_fields": {"value": {"script": {
"lang": "painless", "source": "params.x + params.y",
"params": {"x": ?, "y": ?}
}}}}
""";
Integer sum = jdbc.queryForObject(command, new Object[] { 10, 5 }, Integer.class);

计算针对搜索命中的文档执行;未命中时没有计算结果。支持位置参数、命名参数和标量转换,不支持 JDBC CallableStatement 回调、OUT 参数记录和 SQL 表函数语法。脚本保持固定,输入值通过 params 绑定。

集合条件及空值过滤的写法见条件构造器

查询执行选项

Mapper 文件可配置 statementTypetimeoutfetchSize,具体效果遵循驱动配置。resultSetType 保持 DEFAULT 或使用 FORWARD_ONLY,不支持 SCROLL_INSENSITIVESCROLL_SENSITIVE 滚动结果集。XML 配置见执行选项

查询结果列的说明见结果读取