# 有版本匹配的问题,可能需要安装指定版本。 对应7.X的ES, 我安装的是Elasticsearch=7.13.0的版本
from elasticsearch import Elasticsearch
es = Elasticsearch(["http://IP:port/"])
# 查询所有数据
body1 = {
"query":{
"match_all": {}
}
}
# 等于查询,term: 查询 XX = “xx”,关键词不会被拆分。注意:如果字段值是字符串(尤其是汉字),字段名称后面最好加上“.keyword”进行全匹配,要不然可能查不到(可能是分词的原因)
body2 = {
"query": {
"term": {
"数据库字段": "weixin"
}
},
"size":"5", # 指定查询多少条
}
# 等于查询,terms: 查询 xx = “xx” 或 xx = “yy”
body3 = {
"query":{
"terms":{
"author.keyword": [
"关键词1", "关键词2"
]
}
}
}
# 包含查询,match:匹配author字段包含"XXXX"关键字的数据,关键词分词后再去查询。
# 注意:加上".keyword"是精确查询(完全匹配),如果不加,匹配一个字(分词)就算匹配了
body4 = {
"query": {
"match": {
"author.keyword": "XXXX"
}
}
}
# 包含查询,multi_match: 在author和title字段里匹配包含“新华”关键字的数据。
body5 = {
"query": {
"multi_match": {
"query": "新华",
"fields": ["author.keyword", "title"]
}
}
}
# 复合查询bool
# bool有3类查询关系:
# must(都满足)
# should(没有must和filter时,其中一个满足;如果有must,可以用"minimum_should_match"指定最少满足的条件个数),
# must_not(都不满足),即bool查询必须有这些关系词。
# 查询关系(must)后面用[]包裹多个查询条件,每个查询条件用{}括起来,每个查询条件用“,”分开
body6 = {
"query":{
"bool":{
"must":[
{
"term":{
"author.keyword":"财经"
}
},
{
"term":{
"字段名":"3"
}
}
]
}
}
}
# 范围查询,"range"可以放到复合查询里,"bool":{"must":[{"range":{"XXTime":{"gte":1649952000000,"lt":1650038400000}}}]}
body7 = {
"query":{
"range":{
"createdTime":{
"gte":1649952000000, # >= 大于等于
"lt":1650038400000 # < 小于
}
}
}
}
# 通配符查询
body8 = {
"query":{
"wildcard":{
"title":"zh*"
}
}
}
# 前缀查询
body9 = {
"query":{
"prefix":{
"title":"zh"
}
}
}
# 排序 可以多字段排序,"sort":[{"field1":{"order":"asc"}},{"field2":{"order":"desc"}}]
# 注意顺序!写在前面的优先排序
# 注意,如果是字符串(test)类型,需要修改属性开启fielddata, fielddata非常耗费资源,不建议用,最好是查询结果保存进行后处理。
body10 = {
"query":{
"range":{
"你的字段名":{
"gte": 0, # >= 大于等于
"lt": 0.15, # < 小于
}
}
},
"sort":{
"你的字段名":{ # 根据字段升序排序
"order":"asc" # asc升序,desc降序
}
}
}
# 开启fielddata方法,POST /(你的索引名称)/_mapping,如下body没有验证,不敢修字段属性。(基于python的elasticsearch库,怎么设置属性,不清楚)
body_only_know = { # 此body 仅限于了解
"properties": {
"你的字段名": {
"type": "text",
"fielddata": True
}
}
}
# 聚合,获取最小值。聚合也是要数字类型,如果是text需要修改字段属性"fielddata": True,才能排序或聚合(不敢修改)
body11 = {
"query":{
"range":{
"你的字段名":{
"gte": 0, # >= 大于等于
"lt": 0.15, # < 小于
}
}
},
"aggs":{ # 聚合查询
"min_你的字段名":{ # 最小值的key
"min":{ # 最小
"field":"你的字段名" # 查询最小值
}
}
}
}
# 聚合,获取最大值
body12 = {
"query":{
"range":{
"你的字段名":{
"gte": 0, # >= 大于等于
"lt": 0.15, # < 小于
}
}
},
"aggs":{ # 聚合查询
"max_你的字段名":{ # 最小值的key
"max":{ # 最小
"field":"你的字段名" # 查询最小值
}
}
}
}
# 求和
body13 = {
"query":{
"match_all":{}
},
"aggs":{ # 聚合查询
"sum_你的字段名":{ # 和的key
"sum":{ # 和
"field":"你的字段名" # 获取该字段的和
}
}
}
}
# 求平均值
body14 = {
"query":{
"match_all":{}
},
"aggs":{ # 聚合查询
"avg_你的字段名":{ # 平均值的key
"avg":{ # 平均值
"field":"你的字段名" # 获取所有age的平均值
}
}
}
}
body15 = {
"query":{
"bool":{
"must":[
{
"range":{"你的字段名":{"gte": 0,"lt": 0.15}}
},
{
"term":{"你的字段名.keyword":"财经"}
}
],
"must_not":[
{
"terms":{"你的字段名":["weixin","weibo"]}
}
],
"should":[
{
"wildcard":{
"title":"zh*"
}
},
{
"multi_match":{"query":"财经","fields":["你的字段名.keyword","你的字段名"]}
}
],
"minimum_should_match":1
}
}
}
# 注意doc_type='_doc',ES的新版本会去掉doc_type,发送请求的时候也不用这个参数了,老版本的ES是不是还需要这个参数不知道
#(说8.x会去掉,7.x的查询也不用这个参数了)
# 只获取_id数据
# a = es.search(index="data*", body=body15, filter_path=["hits.hits._id"])
# 获取所有字段数据
# a = es.search(index="data*", body=body10, filter_path=["hits.hits._*"])
a = es.search(index="data*", body=body15)
print(a)
print("=======================")
# b = es.count(index="data*") # 统计索引的数据量
# print(b)
参考:
https://blog.csdn.net/y472360651/article/details/76652021
https://www.cnblogs.com/bainianminguo/articles/12763099.html文章来源地址https://www.toymoban.com/news/detail-508562.html
文章来源:https://www.toymoban.com/news/detail-508562.html
到了这里,关于Python语言,ES(Elasticsearch)基础查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!