当前位置:   article > 正文

elasticsearch 常用搜索命令_elasticsearch查询数据

elasticsearch查询数据

DSL查询分类:

  • 查询所有:查询出所有数据,一般测试用:

  1. # 查询所有
  2. GET /indexName/_search
  3. {
  4. "query":{
  5. "match_all": {
  6. }
  7. }
  8. }
  •  全文检索:

    • match_query:  根据一个字段查询
  1. #全文检索查询 单个字段: 查询name包含如家的酒店
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "match": {
  6. "name": "如家"
  7. }
  8. }
  9. }
    • multi_match_query:根据多个字段查询,参与查询字段越多,查询性能越差
  1. #全文检索查询 多个字段: 查询name、all包含如家的酒店
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "multi_match": {
  6. "query": "如家",
  7. "fields": ["all","name"]
  8. }
  9. }
  10. }
  • 精确查询: 一般查找keyword、日期、数值、boolean等类型

    • term:根据词条精确值查询
  1. #精确查询:
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "term": {
  6. "brand": {
  7. "value": "如家"
  8. }
  9. }
  10. }
  11. }
    • range :根据值的范围查询
  1. #精确查询 range:查询价格在200-300之间的酒店
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "range": {
  6. "price": {
  7. "gte": 200,
  8. "lte": 300
  9. }
  10. }
  11. }
  12. }

注意:如果使用term查询text类型的数据会查询为空

  1. # 字段的类型和查询的类型需要匹配起来
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "term": {
  6. "name": "如家酒店·neo(上海外高桥保税区北地铁站店)"
  7. }
  8. }
  9. }

结果:

  • 地理坐标查询:根据经纬度查询 

    • geo_bounding_box 矩形范围查询
  1. // geo_bounding_box查询
  2. GET /indexName/_search
  3. {
  4. "query":{
  5. "geo_bounding_box":{
  6. "FIELD":{
  7. "top_left":{ // 左上点
  8. "lat":31.1,
  9. "lon":121.5
  10. },
  11. "bottom_right":{ // 右下点
  12. "lat":30.9,
  13. "lon":121.7
  14. }
  15. }
  16. }
  17. }
  18. }
    • geo_distance : 距离查询
  1. # 地理位置查询:离陆家嘴15km之内的酒店
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "geo_distance": {
  6. "distance":"15km",
  7. "location":"31.21,121.5"
  8. }
  9. }
  10. }
  • 复合查询:

    • function_score 算分函数查询,可以控制文档相关性算分,控制文档排名
      • 原始查询条件:query部分,基于这个条件搜索文档,并且基于BM25算法给文档打分,原始算分(query score)
      • 过滤条件:filter部分,符合该条件的文档才会重新算分
      • 算分函数:符合filter条件的文档要根据这个函数做运算,得到的函数算分(function score),有四种函数
      • weight:函数结果是常量
      • field_value_factor:以文档中的某个字段值作为函数结果
      • random_score:以随机数作为函数结果
      • script_score:自定义算分函数算法
      • 运算模式:算分函数的结果、原始查询的相关性算分,两者之间的运算方式,包括:
      • multiply:相乘
      • replace:用function score替换query score
      • 其它,例如:sum、avg、max、min
  1. #function score的运行流程如下:
  2. #- 1)根据原始条件查询搜索文档,并且计算相关性算分,称为原始算分(query score)
  3. #- 2)根据过滤条件,过滤文档
  4. #- 3)符合过滤条件的文档,基于算分函数运算,得到函数算分(function score
  5. #- 4)将原始算分(query score)和函数算分(function score)基于运算模式做运算,得到最终结果,作为相关性算分。
  6. #复合查询:算分函数:让品牌是如家酒店排名靠前
  7. GET /hotel/_search
  8. {
  9. "query": {
  10. "function_score": {
  11. "query": {
  12. "match_all": {}
  13. },
  14. "functions": [
  15. {
  16. "filter": {
  17. "term": {
  18. "brand": "如家"
  19. }
  20. },
  21. "weight": 10
  22. }
  23. ],
  24. "boost_mode": "sum"
  25. }
  26. }
  27. }
    • bool 布尔查询,利用逻辑关系组合多个其它的查询,实现复杂搜索
  1. #布尔查询是一个或多个查询子句的组合,每一个子句就是一个子查询。子查询的组合方式有:
  2. #- must:必须匹配每个子查询,类似“与” and
  3. #- should:选择性匹配子查询,类似“或” or
  4. #- must_not:必须不匹配,不参与算分,类似“非”
  5. #- filter:必须匹配,不参与算分
  6. # bool查询
  7. GET /hotel/_search
  8. {
  9. "query": {
  10. "bool": {
  11. "must": [
  12. {
  13. "match": {
  14. "name": "如家"
  15. }
  16. }
  17. ],
  18. "must_not": [
  19. {
  20. "range": {
  21. "price": {
  22. "gt": 400
  23. }
  24. }
  25. }
  26. ],
  27. "filter": [
  28. {
  29. "geo_distance": {
  30. "distance": "10km",
  31. "location": {
  32. "lat": 31.21,
  33. "lon": 121.5
  34. }
  35. }
  36. }
  37. ]
  38. }
  39. }
  40. }

  • 排序 

    • 普通字段排序 : keyword、数值、日期类型排序的语法基本一致

  1. GET /hotel/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "sort": [
  7. {
  8. "score": {
  9. "order": "desc"
  10. },
  11. "price": {
  12. "order": "asc"
  13. }
  14. }
  15. ]
  16. }
    • 地理坐标排序

  1. #地理坐标排序 找31.034,121.61周围的酒店
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "match_all": {}
  6. },
  7. "sort": [
  8. {
  9. "_geo_distance": {
  10. "location": {
  11. "lat": 31.034,
  12. "lon": 121.61
  13. },
  14. "order": "asc",
  15. "unit": "km"
  16. }
  17. }
  18. ]
  19. }

 

  • 分页

    • 基本的分页

  1. #类似于mysql中的limit ?,?
  2. GET /hotel/_search
  3. {
  4.   "query": {
  5.     "match_all": {}
  6.   },
  7.   "from"0, // 分页开始的位置,默认为0
  8.   "size"10, // 期望获取的文档总数
  9.   "sort": [
  10.     {"price""asc"}
  11.   ]
  12. }
    • 深度分页:search after 方案

  1. #分页时需要排序,原理是从上一次的排序值开始,查询下一页数据
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "match": {
  6. "brand": "如家"
  7. }
  8. },
  9. "size": 5,
  10. "sort": [
  11. {
  12. "price": {
  13. "order": "asc"
  14. },
  15. "id": {
  16. "order": "asc"
  17. }
  18. }
  19. ],
  20. "search_after":[
  21. 149,
  22. "541619"
  23. ]
  24. }
  • 高亮:highlight

模版:

  1. GET /hotel/_search
  2. {
  3.   "query": {
  4.     "match": {
  5.       "FIELD""TEXT" // 查询条件,高亮一定要使用全文检索查询 text
  6.     }
  7.   },
  8.   "highlight": {
  9.     "fields": { // 指定要高亮的字段
  10.       "FIELD": {
  11.         "pre_tags""<em>",  // 用来标记高亮字段的前置标签
  12.         "post_tags""</em>" // 用来标记高亮字段的后置标签
  13.       }
  14.     }
  15.   }
  16. }
  17. 注意:
  18. - 高亮是对关键字高亮,因此搜索条件必须带有关键字,而不能是范围这样的查询。
  19. - 默认情况下,高亮的字段,必须与搜索指定的字段一致,否则无法高亮
  20. - 如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false
  1. #高亮
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "match": {
  6. "all": "如家"
  7. }
  8. },
  9. "highlight": {
  10. "fields": {
  11. "name": {
  12. "require_field_match": "false"
  13. }
  14. }
  15. }
  16. }

其他查询官方文档

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

闽ICP备14008679号