首页 > 编程语言 >python 操作 Elasticsearch7.x版本

python 操作 Elasticsearch7.x版本

时间:2024-04-11 14:37:34浏览次数:37  
标签:body index name python 查询 Elasticsearch7 版本 query es

目录

python 操作 Elasticsearch7.x版本

1. 连接Elasticsearch

from elasticsearch import Elasticsearch
 
# 连接到Elasticsearch
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先进行嗅探
    # sniff_on_start=True,
    # # 节点没有响应时,进行刷新,重新连接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)

2. 索引操作

from elasticsearch import Elasticsearch
 
# 连接到Elasticsearch
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先进行嗅探
    # sniff_on_start=True,
    # # 节点没有响应时,进行刷新,重新连接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
request_body = {
    'mappings': {
        'properties': {
            'name': {
                'type': 'text'
            },
            'id': {
                'type': 'integer'
            },  
        }
    }
}

index_name = 'my_index'

# 1. 创建索引
# 为防止在创建索引的时候出现重复,产生错误,在创建之前最好判断一下索引是否存在
# 索引存在,先删除索引
if es.indices.exists(index_name):
    pass
else:
    print('索引不存在,可以创建')
es.indices.create(index=index_name, body=request_body, ignore=400)
      
# 2. 查看索引的信息
print(es.info())

# 3. 删除索引
es.indices.delete(index=index_name, ignore=[400, 404])
 
"""
ignore参数通常用于控制是否忽略不存在的文档或索引时的错误。这个参数通常在执行删除操作或者在获取文档时使用。

ignore参数可以设置为True或False。当设置为True时,如果尝试删除不存在的文档或获取不存在的文档,Elasticsearch将不会引发错误,而是简单地返回一个空的响应或者指示文档不存在。当设置为False时,如果文档或索引不存在,Elasticsearch将引发错误。

请注意,ignore参数还能接收一个错误代码列表,其中包括应被忽略的HTTP错误代码。400是访问的页面域名不存在或者请求错误,404是“未找到”错误的代码,意味着如果尝试删除的文档或索引不存在,Elasticsearch将不会引发异常
"""    

3. 文档操作

  • es7,doc_type 参数可以不传,也可以查询到
# 1. 添加一个文档到索引
doc = {
    'name': 'John Doe',
    'age': 30,
    'about': 'I love to go rock climbing'
}
results1 = es.index(index='my_index', id=1, document=doc)
 
# 2. 获取一个文档
result2 = es.get(index='my_index', id=1) 
print(result2['_source'])
 
# 3. 更新一个文档
doc['about'] = 'I now love pasta'
results3 = es.update(index='my_index', id=1, document=doc)
 
# 4. 搜索文档
results4 = es.search(index='my_index', query={'match': {'about': 'climbing'}})  # 也可以用body格式的参数进行搜索
for hit in results4['hits']['hits']:
    print(hit)
    
# 5. 删除文档
results5 = es.delete(index="users", id=doc_id)
print(results5['result'])

4. 查询/搜索文档

4.1 body 和 query参数

"""
在Python中使用Elasticsearch 7.x版本时,query参数和body参数的主要区别在于它们的用途。

query参数:通常用于定义查询条件,适用于查询API中查询请求的一部分,例如使用search方法时,你可以将查询条件传递给query参数。

body参数:通常用于定义更复杂的请求体,例如包括查询、聚合、脚本操作等高级功能。在Elasticsearch中,body参数是一个JSON格式的字符串,用于传递更多的查询参数和定义复杂的查询结构
"""
from elasticsearch import Elasticsearch
 
# 假设ES地址为 http://localhost:9200
es = Elasticsearch("http://localhost:9200")
 
# 使用query参数的查询
query = {
    "match": {
        "title": "python"
    }
}
 
# 执行查询
response = es.search(index="my_index", query=query)
 
# 使用body参数的查询
body = {
    "query": {
        "match": {
            "title": "python"
        }
    }
}
 
# 执行查询
response = es.search(index="my_index", body=body)

4.2 其他查询示例

from elasticsearch import Elasticsearch

es = Elasticsearch(['127.0.0.1:9200'])

index_name = 'student'

# -------------------------------------------查询

# ------------------------查询所有数据
dsl = {
    "query":{
        "match_all":{}
    }
}
res = es.search(index=index_name, body=dsl)
print(res)

# ------------------------等于查询,term与terms
# term: 查询 xx = “xx”
dsl = {
   "query": {
      "term": {
         "name": "张三"
      }
   }
}
res = es.search(index=index_name, body=dsl)  # 查询name="张三"的所有数据
print(res)

# terms: 查询 xx = “xx” 或 xx = “yy”
dsl = {
   "query": {
      "terms": {
         "name": [
            "张三", "李四"
         ]
      }
   }
}
res = es.search(index=index_name, body=dsl)  # 查询 name="张三" 或 name="李四" 的所有数据
print(res)

# ------------------------包含查询,match与multi_match
dsl = {
   "query": {
      "match": {
         "name": "张三"
      }
   }
}
res = es.search(index=index_name, body=dsl)  # match: 匹配name包含"张三"关键字的数据
print(res)

dsl = {
   "query": {
      "multi_match": {
         "query": "李四",
         "fields": ["name", "addr"]
      }
   }
}
res = es.search(index=index_name, body=dsl)  # multi_match: 在name和addr里匹配包含 李四 关键字的数据
print(res)

# ------------------------ids
dsl = {
   "query": {
      "ids": {
         # "type": "",
         "values": [
            "1", "2"
         ]
      }
   }
}
res = es.search(index=index_name, body=dsl)  # 搜索出id为1或2的所有数据
print(res)

# ------------------------复合查询bool
# bool有3类查询关系,must(都满足),should(其中一个满足),must_not(都不满足)
dsl = {
   "query": {
      "bool": {
         "must": [
            {
               "term": {
                  "name": "张三"
               }
            },
            {
               "term": {
                  "age": "16"  # 实际张三是15岁,故而未命中
               }
            }
         ]
      }
   }
}
res = es.search(index=index_name, body=dsl)  # 获取name="张三"并且age=16的所有数据
print(res)

# -----------------------切片式查询
dsl = {
    "query":{
        "match_all":{}
    },
    "from":0,    # 从第0条数据开始
    "size":1    # 获取1条数据
}
res = es.search(index=index_name, body=dsl)  # 从第0条数据开始,获取1条数据
print(res)

# -----------------------范围查询
dsl = {
   "query": {
      "range": {
         "age": {
            "gte": 18,  # >=18
            "lte": "30"  # <=30
         }
      }
   }
}
res = es.search(index=index_name, body=dsl)  # 查询前缀为"李"的所有数据
print(res)

# -----------------------前缀查询
dsl = {
   "query": {
      "prefix": {
         "name": "李"
      }
   }
}
res = es.search(index=index_name, body=dsl)  # 查询前缀为"李"的所有数据
print(res)

# -----------------------通配符查询
dsl = {
   "query": {
      "wildcard": {
         "name": "*三"
      }
   }
}
res = es.search(index=index_name, body=dsl)  # 查询name以三为后缀的所有数据
print(res)

#---------------------------排序
dsl = {
    "query":{
        "match_all":{}
    },
    "sort":{
        "age":{                 # 根据age字段升序排序
            "order":"asc"       # asc升序,desc降序
        }
    }
}
res = es.search(index=index_name, body=dsl)
print(res)

dsl = {
    "query":{
        "match_all":{}
    },
    "sort":[
      {
         "age":{                # 先根据age字段升序排序
            "order":"asc"      # asc升序,desc降序
         }
      },
      {
         "name":{               # 后根据name字段升序排序
            "order":"asc"      # asc升序,desc降序
         }
      }
   ],
}  # 多字段排序,注意顺序!写在前面的优先排序
res = es.search(index=index_name, body=dsl)
print(res)

# --------------------------filter_path, 响应过滤
# 只需要获取_id数据,多个条件用逗号隔开
# res = es.search(index=index_name,  filter_path=["hits.hits._id"])  # # 只需要获取_id数据,多个条件用逗号隔开
res = es.search(index=index_name,  filter_path=["hits.hits._*"])  # # 获取所有数据
print(res)

# ------------------count, 执行查询并获取该查询的匹配数
# 获取数据量
res = es.count(index=index_name)
print(res)

# ---------------------度量类聚合
# 获取最小值
dsl =  {
    "query":{
        "match_all":{}
    },
    "aggs":{                        # 聚合查询
        "min_age":{                 # 最小值的key
            "min":{                 # 最小
                "field":"age"       # 查询"age"的最小值
            }
        }
    }
}
res = es.search(index=index_name, body=dsl)  # # 搜索所有数据,并获取age最小的值
print(res)

# 获取最大值
dsl = {
    "query":{
        "match_all":{}
    },
    "aggs":{                        # 聚合查询
        "max_age":{                 # 最大值的key
            "max":{                 # 最大
                "field":"age"       # 查询"age"的最大值
            }
        }
    }
}
res = es.search(index=index_name, body=dsl)  # # 搜索所有数据,并获取age最大的值
print(res)

# 获取和
dsl ={
    "query":{
        "match_all":{}
    },
    "aggs":{                        # 聚合查询
        "sum_age":{                 # 和的key
            "sum":{                 # 和
                "field":"age"       # 获取所有age的和
            }
        }
    }
}
res = es.search(index=index_name, body=dsl)  # 搜索所有数据,并获取所有age的和
print(res)

# 获取平均值
dsl = {
    "query":{
        "match_all":{}
    },
    "aggs":{                        # 聚合查询
        "avg_age":{                 # 平均值的key
            "sum":{                 # 平均值
                "field":"age"       # 获取所有age的平均值
            }
        }
    }
}
res = es.search(index=index_name, body=dsl)
print(res)

# from、size
dsl = {
    "query":{
        "match_all":{}
    },
    "size":"50",
    "from":"0"
}
res = es.search(index=index_name, body=dsl)
print(res)

标签:body,index,name,python,查询,Elasticsearch7,版本,query,es
From: https://www.cnblogs.com/Mcoming/p/18129071

相关文章

  • 【Python】Django中的static资源访问404的问题
    [本文出自天外归云的博客园]如果你发现你本地部署没问题,部署到生产环境服务器后提示404找不到静态资源文件。不是你的代码有问题,而是你没有使用--insecure参数启动服务。pythonmanage.pyrunserver0.0.0.0:8000--insecure但是这个insecure参数在Django4中已经去掉了,所以......
  • Python+Django+Html网页版人脸识别考勤打卡系统
    程序示例精选Python+Django+Html人脸识别考勤打卡系统如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!前言这篇博客针对《Python+Django+Html网页版人脸识别考勤打卡系统》编写代码,代码整洁,规则,易读。学习与应用推荐首选。运行结果文章......
  • python计算机毕设【附源码】养老院管理系统(django+mysql+论文)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着社会的快速发展,人口老龄化问题日益凸显。养老院作为为老年人提供居住、医疗、康复、娱乐等综合服务的场所,其管理水平和服务质量对老年人的生活质量有着......
  • (数据科学学习手札159)使用ruff对Python代码进行自动美化
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,在日常编写Python代码的过程中,由于个人经验及编程习惯上的差异,有些人写出的代码可读性很高,一眼看上去就非常整洁易懂,而有些人写出的代码则十分“潦草随意”,......
  • ansible python API
    version:v2.9官方示例如下:点击查看代码#!/usr/bin/envpythonfrom__future__import(absolute_import,division,print_function)__metaclass__=typeimportjsonimportshutilimportansible.constantsasCfromansible.executor.task_queue_managerimportT......
  • 文献学习-33-一个用于生成手术视频摘要的python库
    VideoSum:APythonLibraryforSurgicalVideoSummarizationAuthors: LuisC.Garcia-Peraza-Herrera,SebastienOurselin,andTomVercauterenSource: https://arxiv.org/pdf/2303.10173.pdf这篇文章主要关注的是如何通过视频摘要来简化和可视化手术视频,以便于数......
  • 批量压缩文件夹里的图片(python)
    起源是我收藏了很多照片,但是太大的照片不利于分享使用,而且我并不需要那么高清晰度,通过在线压缩工具tinypng又太慢拥有python下载python教程有很多,但我推荐使用anaconda管理python,可以灵活的管理python版本,还不会导致本地版本冲突压缩脚本安装pillow库,我在pycharm里可以直接......
  • Python基础语法
    1.常用数据类型2.注释单行注释#需要注释的内容多行注释"""需要注释的内容"""3.变量定义变量名=变量值type()查看数据类型type(需查看类型的数据)4.类型转换类型转换代码int(x)#将x转换成整型float(x)#将x转换成浮点型str(x)#将x转换成字......
  • 【python】python根据传入参数不同,调用不同的方法
    大家好,我是木头左。今天介绍三种不同方法实现根据传入参数不同,调用不同的方法。使用条件语句在Python中,可以使用条件语句(如if-elif-else语句)来根据传入的参数调用不同的方法。以下是一个示例:defmethod1():print("调用方法1")defmethod2():print("调用方法2")d......
  • 【华为OD】2024年华为OD机试C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
    【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客华为OD机试2024年C卷真题题集题库,有2种分数的题目列表,分别是100分的列表、200分的列表需要订阅请看链接:C卷100......