当前位置:   article > 正文

Elasticsearch之常用DSL语句_elasticsearch dsl 语句

elasticsearch dsl 语句

目录

 

1. Elasticsearch之常用DSL语句

1.1 操作索引

1.2 文档操作

1.3 DSL查询

1.4 搜索结果处理

1.5 数据聚合


 

1. Elasticsearch之常用DSL语句

1.1 操作索引

mapping是对索引库中文档的约束,常见的mapping属性包括:

- type:字段数据类型,常见的简单类型有:
  - 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
  - 数值:long、integer、short、byte、double、float、
  - 布尔:boolean
  - 日期:date
  - 对象:object
- index:是否创建索引,默认为true
- analyzer:使用哪种分词器
 

创建索引

  1. PUT /goods
  2. {
  3. "mappings": {
  4. "properties": {
  5. "brandName": {
  6. "type": "keyword"
  7. },
  8. "categoryName": {
  9. "type": "keyword"
  10. },
  11. "createTime": {
  12. "type": "date",
  13. "format": "yyyy-MM-dd HH:mm:ss"
  14. },
  15. "id": {
  16. "type": "keyword"
  17. },
  18. "price": {
  19. "type": "double"
  20. },
  21. "saleNum": {
  22. "type": "integer"
  23. },
  24. "status": {
  25. "type": "integer"
  26. },
  27. "stock": {
  28. "type": "integer"
  29. },
  30. "title": {
  31. "type": "text",
  32. "analyzer": "ik_max_word",
  33. }
  34. }
  35. }
  36. }

查询索引

GET /goods

修改索引库

倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping

虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。

  1. PUT /索引库名/_mapping
  2. {
  3. "properties": {
  4. "新字段名":{
  5. "type": "integer"
  6. }
  7. }
  8. }

删除索引库

DELETE /goods

1.2 文档操作

新增文档

  1. POST /goods/_doc/1
  2. {
  3. "id": 1,
  4. "brandName": "Apple",
  5. "categoryName": "手机",
  6. "createTime": "2023-12-26 20:00:00",
  7. "price": 8000,
  8. "saleNum": 100,
  9. "status": 0,
  10. "stock": 100,
  11. "title": "Apple iPhone 15 Pro 256GB 远峰蓝色 支持移动联通电信5G 双卡双待手机"
  12. }
  13. POST /goods/_doc/2
  14. {
  15. "id": 2,
  16. "brandName": "Huawei",
  17. "categoryName": "手机",
  18. "createTime": "2023-12-26 20:00:00",
  19. "price": 7000,
  20. "saleNum": 400,
  21. "status": 0,
  22. "stock": 200,
  23. "title": "华为 HUAWEI Mate 60 Pro 智能手机 鸿蒙系统卫星通话昆仑玻璃"
  24. }

查询文档

  1. GET /goods/_doc/1
  2. //批量获取
  3. GET goods/_doc/_mget
  4. {
  5. "ids":["1","2"]
  6. }

删除文档

DELETE /goods/_doc/1

修改文档

全量修改是覆盖原来的文档,其本质是:

  • 根据指定的id删除文档
  • 新增一个相同id的文档

注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

  1. PUT /{索引库名}/_doc/文档id
  2. {
  3. "字段1": "值1",
  4. "字段2": "值2",
  5. // ... 略
  6. }

增量修改是只修改指定id匹配的文档中的部分字段。

  1. POST /{索引库名}/_update/文档id
  2. {
  3. "doc": {
  4. "字段名": "新的值",
  5. }
  6. }

1.3 DSL查询

查询所有

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

全文检索

  1. //单字段查询
  2. GET /goods/_search
  3. {
  4. "query": {
  5. "match": {
  6. "title": "手机"
  7. }
  8. }
  9. }
  10. //多字段查询
  11. GET /goods/_search
  12. {
  13. "query": {
  14. "multi_match": {
  15. "query": "手机",
  16. "fields": ["title"]
  17. }
  18. }
  19. }

精准查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:

- term:根据词条精确值查询
- range:根据值的范围查询

term查询的字段是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多,反而搜索不到数据。 

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "term": {
  5. "categoryName": {
  6. "value": "手机"
  7. }
  8. }
  9. }
  10. }
  11. //匹配多个term
  12. GET /goods/_search
  13. {
  14. "query": {
  15. "terms": {
  16. "categoryName": [
  17. "手机",
  18. "电脑"
  19. ]
  20. }
  21. }
  22. }

范围查询,一般应用在对数值类型做范围过滤的时候。比如做价格范围过滤。

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "range": {
  5. "price": {
  6. "gte": 7500,
  7. "lte": 9000
  8. }
  9. }
  10. }
  11. }

复合查询

- must:必须匹配的条件,可以理解为“与”
- should:选择性匹配的条件,可以理解为“或”
- must_not:必须不匹配的条件,不参与打分
- filter:必须匹配的条件,不参与打分

  1. POST goods/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "term": {
  8. "brandName": {
  9. "value": "Apple"
  10. }
  11. }}
  12. ],
  13. "should": [
  14. {
  15. "term": {
  16. "categoryName": {
  17. "value": "手机"
  18. }
  19. }}
  20. ],
  21. "filter": [
  22. {
  23. "range": {
  24. "stock": {
  25. "gt": 0
  26. }
  27. }
  28. }
  29. ]
  30. }
  31. }
  32. }

1.4 搜索结果处理

普通字段排序

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "sort": [
  7. {
  8. "stock": "desc" //asc升序
  9. }
  10. ]
  11. }

分页

elasticsearch中通过修改from、size参数来控制要返回的分页结果:

- from:从第几个文档开始
- size:总共查询几个文档

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "from": 0,
  7. "size": 1
  8. }

高亮显示

  1. POST goods/_search
  2. {
  3. "query": {
  4. "match": {
  5. "title": "手机"
  6. }
  7. },
  8. "highlight": {
  9. "fields": {
  10. "title": {
  11. "pre_tags": [
  12. "<font color='red'>"
  13. ],
  14. "post_tags": [
  15. "</font>"
  16. ]
  17. }
  18. }
  19. }
  20. }

1.5 数据聚合

聚合常见的有三类:

- 桶(Bucket)聚合:用来对文档做分组
  - TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
  - Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

- 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
  - Avg:求平均值
  - Max:求最大值
  - Min:求最小值
  - Stats:同时求max、min、avg、sum等
- 管道(pipeline)聚合:其它聚合的结果为基础做聚合

统计所有数据中的品牌有几种,按照品牌对数据分组。

  1. GET /goods/_search
  2. {
  3. "size": 0, //设置size为0,结果中不包含文档,只包含聚合结果
  4. "aggs": { // 定义聚合
  5. "brandAgg": { //给聚合起个名字
  6. "terms": { // 聚合的类型,按照品牌值聚合,所以选择term
  7. "field": "brandName", // 参与聚合的字段
  8. "size": 20 // 希望获取的聚合结果数量
  9. }
  10. }
  11. }
  12. }

 对于每个品牌的聚合限定聚合范围,并且根据Bucket内的文档数量进行升序排序

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "range": {
  5. "stock": {
  6. "gte": 10
  7. }
  8. }
  9. },
  10. "size": 0, //设置size为0,结果中不包含文档,只包含聚合结果
  11. "aggs": { // 定义聚合
  12. "brandAgg": { //给聚合起个名字
  13. "terms": { // 聚合的类型,按照品牌值聚合,所以选择term
  14. "field": "brandName", // 参与聚合的字段
  15. "size": 20, // 希望获取的聚合结果数量
  16. "order": {
  17. "_count": "asc"
  18. }
  19. }
  20. }
  21. }
  22. }

按照品牌分组,形成了一个个桶。对桶内的数据做运算,获取每个品牌的stock的min、max、avg等值。

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "range": {
  5. "stock": {
  6. "gte": 10
  7. }
  8. }
  9. },
  10. "size": 0,
  11. "aggs": {
  12. "brandAgg": {
  13. "terms": {
  14. "field": "brandName",
  15. "size": 20,
  16. "order": {
  17. "_count": "asc"
  18. }
  19. },
  20. "aggs": {
  21. "stock_status": {
  22. "stats": {
  23. "field": "stock"
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/248795
推荐阅读
相关标签
  

闽ICP备14008679号