Python-ElasticSearch搜索查询的讲解


Posted in Python onFebruary 25, 2019

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可能是目前存在的,不论开源还是私有的,拥有最先进,高性能和全功能搜索引擎功能的库。但是 Lucene 仅仅只是一个库。为了利用它,你需要编写 Java 程序,并在你的 java 程序里面直接集成 Lucene 包。 更坏的情况是,你需要对信息检索有一定程度的理解才能明白 Lucene 是怎么工作的。Lucene 是 很 复杂的。

在上一篇文章中介绍了ElasticSearch的简单使用,接下来记录一下ElasticSearch的查询:

查询所有数据

# 搜索所有数据
es.search(index="my_index",doc_type="test_type")
# 或者
body = {
  "query":{
    "match_all":{}
  }
}
es.search(index="my_index",doc_type="test_type",body=body)

term与terms

# term
body = {
  "query":{
    "term":{
      "name":"python"
    }
  }
}
# 查询name="python"的所有数据
es.search(index="my_index",doc_type="test_type",body=body)
# terms
body = {
  "query":{
    "terms":{
      "name":[
        "python","android"
      ]
    }
  }
}
# 搜索出name="python"或name="android"的所有数据
es.search(index="my_index",doc_type="test_type",body=body)

match与multi_match

# match:匹配name包含python关键字的数据
body = {
  "query":{
    "match":{
      "name":"python"
    }
  }
}
# 查询name包含python关键字的数据
es.search(index="my_index",doc_type="test_type",body=body)
# multi_match:在name和addr里匹配包含深圳关键字的数据
body = {
  "query":{
    "multi_match":{
      "query":"深圳",
      "fields":["name","addr"]
    }
  }
}
# 查询name和addr包含"深圳"关键字的数据
es.search(index="my_index",doc_type="test_type",body=body)

ids

body = {
  "query":{
    "ids":{
      "type":"test_type",
      "values":[
        "1","2"
      ]
    }
  }
}
# 搜索出id为1或2d的所有数据
es.search(index="my_index",doc_type="test_type",body=body)

复合查询bool

bool有3类查询关系,must(都满足),should(其中一个满足),must_not(都不满足)

body = {
  "query":{
    "bool":{
      "must":[
        {
          "term":{
            "name":"python"
          }
        },
        {
          "term":{
            "age":18
          }
        }
      ]
    }
  }
}
# 获取name="python"并且age=18的所有数据
es.search(index="my_index",doc_type="test_type",body=body)

切片式查询

body = {
  "query":{
    "match_all":{}
  }
  "from":2  # 从第二条数据开始
  "size":4  # 获取4条数据
}
# 从第2条数据开始,获取4条数据
es.search(index="my_index",doc_type="test_type",body=body)

范围查询

body = {
  "query":{
    "range":{
      "age":{
        "gte":18,    # >=18
        "lte":30    # <=30
      }
    }
  }
}
# 查询18<=age<=30的所有数据
es.search(index="my_index",doc_type="test_type",body=body)

前缀查询

body = {
  "query":{
    "prefix":{
      "name":"p"
    }
  }
}
# 查询前缀为"赵"的所有数据
es.search(index="my_index",doc_type="test_type",body=body)

通配符查询

body = {
  "query":{
    "wildcard":{
      "name":"*id"
    }
  }
}
# 查询name以id为后缀的所有数据
es.search(index="my_index",doc_type="test_type",body=body)

排序

body = {
  "query":{
    "match_all":{}
  }
  "sort":{
    "age":{         # 根据age字段升序排序
      "order":"asc"    # asc升序,desc降序
    }
  }
}

filter_path

响应过滤

# 只需要获取_id数据,多个条件用逗号隔开
es.search(index="my_index",doc_type="test_type",filter_path=["hits.hits._id"])
# 获取所有数据
es.search(index="my_index",doc_type="test_type",filter_path=["hits.hits._*"])

count

执行查询并获取该查询的匹配数

# 获取数据量
es.count(index="my_index",doc_type="test_type")

度量类聚合

  • 获取最小值
body = {
  "query":{
    "match_all":{}
  },
  "aggs":{            # 聚合查询
    "min_age":{         # 最小值的key
      "min":{         # 最小
        "field":"age"    # 查询"age"的最小值
      }
    }
  }
}
# 搜索所有数据,并获取age最小的值
es.search(index="my_index",doc_type="test_type",body=body)
  • 获取最大值
body = {
  "query":{
    "match_all":{}
  },
  "aggs":{            # 聚合查询
    "max_age":{         # 最大值的key
      "max":{         # 最大
        "field":"age"    # 查询"age"的最大值
      }
    }
  }
}
# 搜索所有数据,并获取age最大的值
es.search(index="my_index",doc_type="test_type",body=body)
  • 获取和
body = {
  "query":{
    "match_all":{}
  },
  "aggs":{            # 聚合查询
    "sum_age":{         # 和的key
      "sum":{         # 和
        "field":"age"    # 获取所有age的和
      }
    }
  }
}
# 搜索所有数据,并获取所有age的和
es.search(index="my_index",doc_type="test_type",body=body)
  • 获取平均值
body = {
  "query":{
    "match_all":{}
  },
  "aggs":{            # 聚合查询
    "avg_age":{         # 平均值的key
      "sum":{         # 平均值
        "field":"age"    # 获取所有age的平均值
      }
    }
  }
}
# 搜索所有数据,获取所有age的平均值
es.search(index="my_index",doc_type="test_type",body=body)

更多的搜索用法:

https://elasticsearch-py.readthedocs.io/en/master/api.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python实现系统状态监测和故障转移实例方法
Nov 18 Python
浅析Python中的多条件排序实现
Jun 07 Python
python制作websocket服务器实例分享
Nov 20 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
python set内置函数的具体使用
Jul 02 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
Python pip install如何修改默认下载路径
Apr 29 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
Python定时任务APScheduler安装及使用解析
Aug 07 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 #Python
selenium python 实现基本自动化测试的示例代码
Feb 25 #Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 #Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 #Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 #Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 #Python
Python常用爬虫代码总结方便查询
Feb 25 #Python
You might like
PHP异常处理浅析
2015/05/12 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
php curl发送请求实例方法
2019/08/01 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
js点击选择文本的方法
2015/02/09 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
Python文件去除注释的方法
2015/05/25 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
python线性插值解析
2020/07/05 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
电气技术员岗位职责
2013/11/19 职场文书
大学毕业生自荐书怎么写?
2014/01/06 职场文书
学校教研活动总结
2014/07/02 职场文书
商业门面租房协议书
2014/11/25 职场文书
大连星海广场导游词
2015/02/10 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL