查询文档
一、精确匹配单个字段
elasticsearch的term查询,下面给出完整的代码
1 | // 创建term查询条件,用于精确查询 |
模糊匹配 match、fuzzy、wildCard
match
分词匹配检索, 按照默认分词器将传入参数进行分词,如下面例子会分成老、板进行检索
1 | elastic.NewMatchQuery("name", "老板") |
得到的结果可能是:
1 | 老板 |
wildcard
通配符检索,即相当于sql的like,在前后拼接*,匹配0到多个任意字符;也可使用?匹配单个字符
1 | elastic.NewWildcardQuery("name", "*li*") |
得到的结果可能是:
1 | lisi |
注意:在业务场景中应该警惕使用wildcard检索。以*或?开头的检索,会增加查询匹配需要的迭代次数并降低搜索性能,增大带有通配符构造出来的DFA(Deterministic Finite Automaton)的复杂堵,导致CPU开销增大,从而导致集群宕机的风险。那有什么解决类似mysql like查询的方案吗?
fuzzy
模糊/纠错检索, 对输入参数进行一定程度的容错
1 | elastic.NewFuzzyQuery("name", "李四") |
得到的结果可能是:
1 | 李四 |
二、通过terms实现SQL的in查询
通过terms查询语法实现,多值查询效果
1 | // 创建terms查询条件 |
三、匹配单个字段
某个字段使用全文搜索,也就是ES的match语法
例子:
1 | // 创建match查询条件 |
四、范围查询
实现类似Created > ‘2020-07-20’ and Created < ‘2020-07-22’的范围查询条件
range 表示获取指定字段值的范围,相当于sql中的 <> ,其中gt为 > , lt为 < ,gte为 >=, lte为 <=;
创建查询表达式例子:
1 | // 例1 等价表达式: Created > "2020-07-20" and Created < "2020-07-29" |
五、bool组合查询
bool组合查询,实际上就是组合了前面的查询条件,然后通过类似SQL语句的and和or将查询条件组合起来,不熟悉ES查询语法,请参考ES教程
5.1. must条件
类似SQL的and,代表必须匹配的条件。
1 | // 创建bool查询 |
5.2. must_not条件
跟must的作用相反,用法和must类似
1 | // 创建bool查询 |
5.3. should条件
类似SQL中的 or, 只要匹配其中一个条件即可
1 | // 创建bool查询 |
5.2. filter条件
filter 表示根据过滤条件得到满足的文档;
1 | q.Filter(elastic.NewTermQuery("account", "1")) |
5.2. terms条件
terms 表示为匹配指定字段的多个值 ,相当于sql中的 in ;
1 | elastic.NewTermsQueryFromStrings("name", []string{"zhangsan", "lisi"}) |
5.2. exists条件
exists 表示判断是否存在, 既可以判断该字段是否在es中是否为空
1 | elastic.NewExistsQuery("name") |
六、 Aggregation(聚合)
6.1. es聚合类型:
1. Bucketing aggregation, 类似mysql 的group by;
2. Metric aggregation, 数学运算,对文档统计分析
3. Matrix aggregation,对多个字段进行操作返回一个矩阵结果;
4. Pipeline aggregation,聚合结果进行二次聚合
6.2. 指标聚合
Value Count
值聚合,统计文档总数,等同于sql的count函数
1 | client, err := elastic.NewClient() |
6.2. Cardinality
基数聚合,等同sql的count(DISTINCT 字段)
1 | aggs := elastic.NewCardinalityAggregation(). |
6.3. Avg
1 | aggs := elastic.NewAvgAggregation().Field("price") |
6.4. Sum
1 | aggs := elastic.NewSumAggregation().Field("price") |
6.5. Max
1 | aggs := elastic.NewAvgAggregation().Field("price") |
6.3. Avg
1 | aggs := elastic.NewAvgAggregation().Field("price") |
6.3. Avg
1 | aggs := elastic.NewAvgAggregation().Field("price") |
6.4. Max
1 | aggs := elastic.NewMaxAggregation().Field("price") |
6.5. Min
1 | aggs := elastic.NewMinAggregation().Field("price") |
6.4. Terms Aggregation : group by
1 | client, err := elastic.NewClient() |
6.4. Histogram聚合
直方图聚合即根据数值间隔分组,histogram聚合分桶统计结果
1 | client, err := elastic.NewClient() |
6.4. Date histogram聚合
功能类似于histogram聚合,主要作用为处理时间类型之短,根据时间、日期进行分桶统计
1 | aggs := elastic.NewDateHistogramAggregation(). |
6.4. Range聚合
按照数值范围进行分桶统计
1 | aggs := elastic.NewRangeAggregation(). |