Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
design
提交
aefbb742
D
design
项目概览
Kwan的解忧杂货铺@新空间代码工作室
/
design
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
design
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
aefbb742
编写于
7月 30, 2023
作者:
Kwan的解忧杂货铺@新空间代码工作室
🐭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:es滚动查询
上级
815d0a00
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
72 addition
and
17 deletion
+72
-17
src/main/java/com/study/design/controller/EsController.java
src/main/java/com/study/design/controller/EsController.java
+0
-2
src/main/java/com/study/design/esquery/EsQueryProcessor.java
src/main/java/com/study/design/esquery/EsQueryProcessor.java
+36
-10
src/main/java/com/study/design/esquery/EsSqlQuery.java
src/main/java/com/study/design/esquery/EsSqlQuery.java
+17
-0
src/main/java/com/study/design/esquery/EsSqlResult.java
src/main/java/com/study/design/esquery/EsSqlResult.java
+18
-0
src/main/java/com/study/design/service/EsService.java
src/main/java/com/study/design/service/EsService.java
+1
-5
未找到文件。
src/main/java/com/study/design/controller/EsController.java
浏览文件 @
aefbb742
...
...
@@ -13,8 +13,6 @@ public class EsController {
@PostMapping
(
"es"
)
public
Boolean
query
(
@RequestParam
String
query
,
Long
fetchSize
)
{
return
esService
.
query
(
query
,
fetchSize
);
}
}
src/main/java/com/study/design/esquery/EsQueryProcessor.java
浏览文件 @
aefbb742
...
...
@@ -13,16 +13,32 @@ import java.util.stream.Collectors;
import
java.util.stream.Stream
;
import
java.util.stream.StreamSupport
;
/**
* 查询处理器
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/30 18:11
*/
@Component
public
class
EsQueryProcessor
{
//1. 我们要用stream 返回 为了节省内存
/**
* 用stream 返回 为了节省内存
*
* @param query
* @param fetchSize
* @return
*/
public
Stream
<
Map
<
String
,
Object
>>
scrollEsStream
(
String
query
,
Long
fetchSize
)
{
return
StreamSupport
.
stream
(
Spliterators
.
spliteratorUnknownSize
(
new
ScrollIterator
(
query
,
fetchSize
),
0
),
false
);
}
//2. 我们要 迭代器
/**
* 要用迭代器
*/
private
class
ScrollIterator
implements
Iterator
<
Map
<
String
,
Object
>>
{
private
String
scrollId
;
private
List
<
String
>
columns
;
...
...
@@ -36,18 +52,23 @@ public class EsQueryProcessor {
new
EsSqlQuery
(
query
,
fetchSize
),
EsSqlResult
.
class
);
//第一次访问的结果出来了
this
.
scrollId
=
esSqlResult
.
getCursor
();
this
.
columns
=
esSqlResult
.
getColumns
()
.
stream
().
map
(
x
->
x
.
get
(
"name"
))
.
stream
().
map
(
x
->
x
.
get
(
"name"
))
.
collect
(
Collectors
.
toList
());
this
.
iterator
=
convert
(
columns
,
esSqlResult
).
iterator
();
}
// hasNext 根据 是否 scrollId 为null进行后续的 第二次,第三次,,,的访问,直到 scrollId 为null
/**
* hasNext 根据 是否 scrollId 为null进行后续的 第二次,第三次,,,的访问,直到 scrollId 为null
*
* @return
*/
@Override
public
boolean
hasNext
()
{
return
iterator
.
hasNext
()
||
scrollNext
();
}
private
boolean
scrollNext
()
{
if
(
iterator
==
null
||
this
.
scrollId
==
null
)
{
if
(
iterator
==
null
||
this
.
scrollId
==
null
)
{
return
false
;
}
EsSqlResult
esSqlResult
=
restTemplate
.
postForObject
(
"http://localhost:9200/_sql?format=json"
,
...
...
@@ -64,13 +85,18 @@ public class EsQueryProcessor {
}
//3. 返回结果传统一点 List<map>
/**
* 返回结果传统一点 List<map>
*
* @param columns
* @param esSqlResult
* @return
*/
private
List
<
Map
<
String
,
Object
>>
convert
(
List
<
String
>
columns
,
EsSqlResult
esSqlResult
)
{
List
<
Map
<
String
,
Object
>>
results
=
new
ArrayList
<>();
for
(
List
<
Object
>
row
:
esSqlResult
.
getRows
())
{
for
(
List
<
Object
>
row
:
esSqlResult
.
getRows
())
{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
for
(
int
i
=
0
;
i
<
columns
.
size
();
i
++)
{
for
(
int
i
=
0
;
i
<
columns
.
size
();
i
++)
{
map
.
put
(
columns
.
get
(
i
),
row
.
get
(
i
));
}
results
.
add
(
map
);
...
...
src/main/java/com/study/design/esquery/EsSqlQuery.java
浏览文件 @
aefbb742
...
...
@@ -2,10 +2,27 @@ package com.study.design.esquery;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
/**
* 查询参数
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/30 18:10
*/
@JsonIgnoreProperties
public
class
EsSqlQuery
{
/**
* 查询的sql
*/
private
String
query
;
/**
* 一次获取的数量
*/
private
Long
fetchSize
;
/**
* 游标
*/
private
String
cursor
;
public
EsSqlQuery
(
String
cursor
)
{
...
...
src/main/java/com/study/design/esquery/EsSqlResult.java
浏览文件 @
aefbb742
...
...
@@ -3,9 +3,27 @@ package com.study.design.esquery;
import
java.util.List
;
import
java.util.Map
;
/**
* 查询的结果集
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/30 18:11
*/
public
class
EsSqlResult
{
/**
* 列名
*/
private
List
<
Map
<
String
,
String
>>
columns
;
/**
* 行数据信息
*/
private
List
<
List
<
Object
>>
rows
;
/**
* 游标
*/
private
String
cursor
;
public
List
<
Map
<
String
,
String
>>
getColumns
()
{
...
...
src/main/java/com/study/design/service/EsService.java
浏览文件 @
aefbb742
package
com.study.design.service
;
import
com.study.design.esquery.EsQueryProcessor
;
import
com.study.design.order.pojo.Order
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Stream
;
...
...
@@ -16,7 +12,7 @@ public class EsService {
@Autowired
private
EsQueryProcessor
esQueryProcessor
;
public
Boolean
query
(
String
query
,
Long
fetchSize
)
{
Stream
<
Map
<
String
,
Object
>>
mapStream
=
esQueryProcessor
.
scrollEsStream
(
query
,
fetchSize
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录