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中使用copy模块实现列表(list)拷贝
Apr 14 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
python3中str(字符串)的使用教程
Mar 23 Python
Django在win10下的安装并创建工程
Nov 20 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
详解Appium+Python之生成html测试报告
Jan 04 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
python for循环赋值问题
Jun 03 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
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
python实现给数组按片赋值的方法
2015/07/28 Python
利用Python实现图书超期提醒
2016/08/02 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
python实现图片中文字分割效果
2019/07/22 Python
Python Collatz序列实现过程解析
2019/10/12 Python
python实现简单图书管理系统
2019/11/22 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
什么是serialVersionUID
2016/03/04 面试题
工作表现评语
2014/01/19 职场文书
市场营销管理制度
2014/01/29 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
幼师中班个人总结
2015/02/12 职场文书
经营场所证明范本
2015/06/19 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
nginx.conf配置文件结构小结
2022/04/08 Servers