快捷搜索:  汽车  科技

大家称赞的日志分析工具:别只会搜日志了 求你懂点原理吧

大家称赞的日志分析工具:别只会搜日志了 求你懂点原理吧DSL: Domain Specific LanguageGET bank/_search { "query":{"match_all": {}} "sort": [ {"account_number": "asc" } ] } 示例:查询出所有,先按照 accout_number 升序排序,再按照 balance 降序排序属性值说明:took – ES 执行搜索的时间 ( 毫秒 ) timed_out – ES 是否超时 _shards – 有多少个分片被搜索了,以及统计了成功/失败/跳过的搜索的分片 max_score – 最高得分 hits.total.value - 命中多少条记录 hits.sort - 结果的排序 key 键,没有则按 score 排序 hits._score -

可以从返回结果中看到 bank 索引有 1000 条数据,占用了 440.2kb 存储空间。

回到顶部

五、高阶检索玩法5.1 两种查询方式5.1.1 URL 后接参数

GET bank/_search?q=*&sort=account_number: asc

```/_search?q=*&sort=account_number: asc`

查询出所有数据,共 1000 条数据,耗时 1ms,只展示 10 条数据 ( ES 分页 )

大家称赞的日志分析工具:别只会搜日志了 求你懂点原理吧(1)

属性值说明:

took – ES 执行搜索的时间 ( 毫秒 ) timed_out – ES 是否超时 _shards – 有多少个分片被搜索了,以及统计了成功/失败/跳过的搜索的分片 max_score – 最高得分 hits.total.value - 命中多少条记录 hits.sort - 结果的排序 key 键,没有则按 score 排序 hits._score - 相关性得分 参考文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-search.html 5.1.2 URL 加请求体进行检索 ( QueryDSL )

请求体中写查询条件

语法:

GET bank/_search { "query":{"match_all": {}} "sort": [ {"account_number": "asc" } ] }

示例:查询出所有,先按照 accout_number 升序排序,再按照 balance 降序排序

大家称赞的日志分析工具:别只会搜日志了 求你懂点原理吧(2)

5.2 详解 QueryDSL 查询

DSL: Domain Specific Language

5.2.1 全部匹配 match_all

示例:查询所有记录,按照 balance 降序排序,只返回第 11 条记录到第 20 条记录,只显示 balance 和 firstname 字段。

GET bank/_search { "query": { "match_all": {} } "sort": [ { "balance": { "order": "desc" } } ] "from": 10 "size": 10 "_source": ["balance" "firstname"] } 5.2.2 匹配查询 match

  • 基本类型 ( 非字符串 ) ,精确匹配

GET bank/_search { "query": { "match": {"account_number": "30"} } }

  • 字符串,全文检索

GET bank/_search { "query": { "match": { "address": "mill road" } } }

大家称赞的日志分析工具:别只会搜日志了 求你懂点原理吧(3)

全文检索按照评分进行排序,会对检索条件进行分词匹配。

查询 address 中包含 mill 或者 road 或者 mill road 的所有记录,并给出相关性得分。

查到了 32 条记录,最高的一条记录是 Address = "990 Mill Road",得分:8.926605. Address="198 Mill Lane" 评分 5.4032025,只匹配到了 Mill 单词。

5.2.3 短语匹配 match_phase

将需要匹配的值当成一个整体单词 ( 不分词 ) 进行检索

GET bank/_search { "query": { "match_phrase": { "address": "mill road" } } }

查出 address 中包含 mill road 的所有记录,并给出相关性得分

5.2.4 多字段匹配 multi_match

GET bank/_search { "query": { "multi_match": { "query": "mill land" "fields": [ "state" "address" ] } } }

multi_match 中的 query 也会进行分词。

查询 state 包含 mill 或 land 或者 address 包含 mill 或 land 的记录。

5.2.5 复合查询 bool

复合语句可以合并任何其他查询语句,包括复合语句。复合语句之间可以相互嵌套,可以表达复杂的逻辑。

搭配使用 must must_not should

must: 必须达到 must 指定的条件。 ( 影响相关性得分 )

must_not: 必须不满足 must_not 的条件。 ( 不影响相关性得分 )

should: 如果满足 should 条件,则可以提高得分。如果不满足,也可以查询出记录。 ( 影响相关性得分 )

示例:查询出地址包含 mill,且性别为 M,年龄不等于 28 的记录,且优先展示 firstname 包含 Winnie 的记录。

GET bank/_search { "query": { "bool": { "must": [ { "match": { "address": "mill" } } { "match": { "gender": "M" } } ] "must_not": [ { "match": { "age": "28" } } ] "should": [ { "match": { "firstname": "Winnie" } } ] } } } 5.2.6 filter 过滤

不影响相关性得分,查询出满足 filter 条件的记录。

在 bool 中使用。

GET bank/_search { "query": { "bool": { "filter": [ { "range": { "age": { "gte":18 "lte":40 } } } ] } } } 5.2.7 term 查询

匹配某个属性的值。

全文检索字段用 match,其他非 text 字段匹配用 term

keyword:文本精确匹配 ( 全部匹配 )

match_phase:文本短语匹配

非 text 字段精确匹配 GET bank/_search { "query": { "term": { "age": "20" } } } 5.2.8 aggregations 聚合

聚合:从数据中分组和提取数据。类似于 SQL GROUP BY 和 SQL 聚合函数。

Elasticsearch 可以将命中结果和多个聚合结果同时返回。

聚合语法:

"aggregations" : { "<聚合名称 1>" : { "<聚合类型>" : { <聚合体内容> } [ "元数据" : { [<meta_data_body>] }]? [ "aggregations" : { [<sub_aggregation>] }]? } [ "聚合名称 2>" : { ... }]* }

  • 示例 1:搜索 address 中包含 big 的所有人的年龄分布 ( 前 10 条 ) 以及平均年龄,以及平均薪资

GET bank/_search { "query": { "match": { "address": "mill" } } "aggs": { "ageAggr": { "terms": { "field": "age" "size": 10 } } "ageAvg": { "avg": { "field": "age" } } "balanceAvg": { "avg": { "field": "balance" } } } }

检索结果如下所示:

hits 记录返回了,三种聚合结果也返回了,平均年龄 34 岁,平均薪资 25208.0,品骏年龄分布:38 岁的有 2 个,28 岁的有一个,32 岁的有一个

大家称赞的日志分析工具:别只会搜日志了 求你懂点原理吧(4)

如果不想返回 hits 结果,可以在最后面设置 size:0

GET bank/_search { "query": { "match": { "address": "mill" } } "aggs": { "ageAggr": { "terms": { "field": "age" "size": 10 } } } "size": 0 }

  • 示例 2:按照年龄聚合,并且查询这些年龄段的平均薪资

从结果可以看到 31 岁的有 61 个,平均薪资 28312.9,其他年龄的聚合结果类似。

大家称赞的日志分析工具:别只会搜日志了 求你懂点原理吧(5)

猜您喜欢: