-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquery.go
More file actions
189 lines (171 loc) · 5.23 KB
/
query.go
File metadata and controls
189 lines (171 loc) · 5.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package esquery
import (
"encoding/json"
)
// Map 用于表示 Elasticsearch 查询的键值对
type Map = map[string]any
// Query 查询信息,用于重入如分页查询等
type Query struct {
Index string `json:"index,omitempty"` // 查询的索引名
DSL *ESQuery `json:"dsl,omitempty"` // 查询语句DSL
Comment string `json:"comment,omitempty"` // 查询注释
}
// Data 查询的结果数据
type Data struct {
Detail any `json:"detail,omitempty"` // 详细数据
Aggs any `json:"aggs,omitempty"` // 聚合数据
Total int `json:"total,omitempty"` // 总记录数
IDs []string `json:"ids,omitempty"` // 数据ID列表
}
// ESQuery 定义主查询结构
type ESQuery struct {
Query Map `json:"query"` // 查询条件
Sort []Map `json:"sort,omitempty"` // 排序条件
Aggs Map `json:"aggs,omitempty"` // 聚合条件
Size int `json:"size,omitempty"` // 记录数
}
// JSON json序列化
func (eq *ESQuery) JSON() string {
d, _ := json.Marshal(eq)
return string(d)
}
// Bool 构造Bool查询(支持 must、should、filter、must_not等)
func Bool(opts ...Option) Map {
paramMap := NewOptMap(opts...)
return Map{"bool": paramMap}
}
// Term 构造 Term 查询, 进行精确匹配
// @param field 查询字段
// @param value 查询值, 不进行分词
// @param opts option不定参数
func Term(field string, value any, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap[field] = value
return Map{"term": paramMap}
}
// Terms 构造 Term 查询, 进行精确匹配
// @param field 查询字段
// @param values 查询值不定参数列表, 不进行分词
// @param opts option不定参数
func Terms(field string, values []any, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap[field] = values
return Map{"terms": paramMap}
}
// Match 构造 Match 查询, 全文检索(模糊匹配、分词搜索、相关度评分)
// @param field 查询字段
// @param value 查询值, 进行分词
// @param opts option不定参数
func Match(field string, value any, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap[field] = value
return Map{"match": paramMap}
}
// MultiMatch 构造MultiMatch查询, match查询的多字段版本,专为多字段搜索设计
// @param query 查询值
// @param fields 查询字段列表
// @param opts option不定参数
func MultiMatch(query string, fields []string, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap["query"] = query
paramMap["fields"] = fields
return Map{"multi_match": paramMap}
}
// Range 构造 Range 查询
// @param field 查询字段
// @param gte (>=)大于等于指定值
// @param gt (>)大于指定值
// @param lt (<)小于指定值
// @param lte (<=)小于等于指定值
// @param opts option不定参数
func Range(field string, gte, gt, lt, lte any, opts ...Option) Map {
paramMap := NewOptMap(opts...)
if gte != nil {
paramMap["gte"] = gte
}
if gt != nil {
paramMap["gt"] = gt
}
if lt != nil {
paramMap["lt"] = lt
}
if lte != nil {
paramMap["lte"] = lte
}
return Map{
"range": Map{
field: paramMap,
},
}
}
// Nested 构造Nested查询, 用于在嵌套字段(nested type)文档中执行独立的查询
// @param path 索引路径(名称)
// @param query 查询语句
// @param opts option不定参数
func Nested(path string, query Map, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap["path"] = path
paramMap["query"] = query
return Map{"nested": paramMap}
}
// ScriptScore 构造Script Score查询, 通过自定义脚本计算每个文档的得分
// @param query 查询语句
// @param script 计算score脚本
// @param opts option不定参数, 为script指定参数
func ScriptScore(query Map, script string, opts ...Option) Map {
paramMap := NewOptMap(opts...)
return Map{
"script_score": Map{
"query": query,
"script": Map{
"source": script,
"params": paramMap,
},
},
}
}
// Wildcard 构造Wildcard查询, 基于通配符的字符串匹配
// @param field 查询字段
// @param value 通配符表达式
// @param opts option不定参数, 为script指定参数
func Wildcard(field string, value string, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap["value"] = value
return Map{
"wildcard": Map{
field: paramMap,
},
}
}
// Exists 构造Exists查询,判断某个字段是否存在
// @param field 判断的字段
func Exists(field string) Map {
return Map{
"exists": Map{
"field": field,
},
}
}
// GeoDistance 构造 GeoDistance 查询
// @param field 查询字段
// @param lat 纬度
// @param lon 经度
// @param distance 距离阈值, 带单位km、mi、m、yd、ft
// @param opts option不定参数, 为script指定参数
func GeoDistance(field string, lat, lon float64, distance string, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap["distance"] = distance
paramMap[field] = map[string]float64{"lat": lat, "lon": lon}
return Map{"geo_distance": paramMap}
}
// Knn 构造 KNN 查询
// @param field 查询字段
// @param vector 查询向量
// @param filter 过滤条件
// @param opts option不定参数
func Knn(field string, vector []float32, opts ...Option) Map {
paramMap := NewOptMap(opts...)
paramMap["field"] = field
paramMap["query_vector"] = vector
return Map{"knn": paramMap}
}