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显示生日是星期几的方法
May 27 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
flask中过滤器的使用详解
Aug 01 Python
Python多进程原理与用法分析
Aug 21 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
对python函数签名的方法详解
Jan 22 Python
Python读取指定日期邮件的实例
Feb 01 Python
Python 学习教程之networkx
Apr 15 Python
python爬虫中url管理器去重操作实例
Nov 30 Python
python 制作本地应用搜索工具
Feb 27 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 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+ajax注册实时验证功能
2016/07/20 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
JavaScript中的this机制
2016/01/30 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
Python常用列表数据结构小结
2014/08/06 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python中datetime模块参考手册
2017/01/13 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
python 实现图片裁剪小工具
2021/02/02 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
物业管理员岗位职责范文
2013/11/25 职场文书
硕士研究生个人求职信
2013/12/04 职场文书
最新党员思想汇报
2014/01/01 职场文书
策划总监岗位职责
2014/02/16 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
先进个人推荐材料
2014/12/29 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android