当前位置: 首页 > wzjs >正文

微信上的网站怎么做的吗网站后台 二级域名

微信上的网站怎么做的吗,网站后台 二级域名,wordpress素材下载站,分类信息发布网站模板好的,从 pymysql (操作关系型数据库如 MySQL) 切换到 Elasticsearch (ES) 会有一些概念上的转变,但核心的增删改查 (CRUD) 思想是相通的。下面我将为你提供一个教程,并尽量用你熟悉的 SQL 概念进行类比。 核心概念类比 Elasticsearch 概念S…

好的,从 pymysql (操作关系型数据库如 MySQL) 切换到 Elasticsearch (ES) 会有一些概念上的转变,但核心的增删改查 (CRUD) 思想是相通的。下面我将为你提供一个教程,并尽量用你熟悉的 SQL 概念进行类比。

核心概念类比

Elasticsearch 概念SQL 概念解释
Index (索引)Database (数据库) 或 Table (表)ES 中的 Index 更常被类比为 SQL 中的 Table。它是相关文档的集合。虽然一个 ES 集群可以有多个 Index,类似于一个数据库服务器可以有多个 Database,但在 CRUD 操作层面,Index 更像 Table。
Document (文档)Row (行)ES 中存储的基本单位,以 JSON 格式表示。
_id (文档ID)Primary Key (主键)文档的唯一标识符。
Mapping (映射)Schema (表结构)定义 Index中文档的字段类型和属性。ES可以动态推断类型,但也支持显式定义。
Fields (字段)Columns (列)Document 中的键值对。

准备工作:安装 Elasticsearch Python 客户端

首先,你需要安装官方的 Elasticsearch Python 客户端:

pip install elasticsearch

连接到 Elasticsearch

pymysql.connect() 类似,你需要先连接到你的 ES 服务。

from elasticsearch import Elasticsearch# 假设你的 Elasticsearch 服务运行在本地 localhost:9200
# 如果有用户名和密码认证:
# es = Elasticsearch(
# cloud_id="YOUR_CLOUD_ID", # 如果使用 Elastic Cloud
# api_key="YOUR_API_KEY" # 或者 http_auth=('user', 'password')
# )
# 对于本地或无密码认证的实例:
try:es = Elasticsearch(['http://localhost:9200'])if es.ping():print("成功连接到 Elasticsearch!")else:print("无法连接到 Elasticsearch!")
except ConnectionRefusedError:print("连接被拒绝,请确保 Elasticsearch 服务正在运行并且地址正确。")
except Exception as e:print(f"连接时发生错误: {e}")# 后续操作都需要这个 'es' 对象

增 (Create / Indexing) - 插入数据

在 ES 中,“创建”一个新文档通常称为 Indexing (索引)。如果你提供 _id,并且该 _id 已存在,则会更新现有文档(除非显式指定为创建操作)。如果不提供 _id,ES 会自动生成一个。

类比 SQL 的 INSERT

-- SQL
INSERT INTO users (id, name, age) VALUES (1, '张三', 30);
INSERT INTO logs (message, timestamp) VALUES ('User logged in', '2025-05-19T10:00:00'); -- 无主键,数据库自动生成

Elasticsearch Python 实现:

# 1. 插入一个带有指定 ID 的文档
doc1 = {"name": "张三", "age": 30, "email": "zhangsan@example.com"}
try:response = es.index(index="my_users", id="user1", document=doc1) # 'my_users' 是 Index 名称print(f"文档 'user1' 索引成功: {response['result']}") # result 会是 'created' 或 'updated'
except Exception as e:print(f"索引文档 'user1' 失败: {e}")# 2. 插入一个不指定 ID 的文档 (ES 自动生成 ID)
doc2 = {"message": "User logged in", "timestamp": "2025-05-19T10:00:00Z"}
try:response = es.index(index="my_logs", document=doc2) # 'my_logs' 是 Index 名称generated_id = response['_id']print(f"文档索引成功,自动生成 ID: {generated_id}, 结果: {response['result']}")
except Exception as e:print(f"索引文档失败: {e}")# 强制创建 (如果 ID 已存在则会报错)
doc3 = {"name": "李四", "age": 25}
try:# op_type="create" 表示如果 id 已存在,则操作失败response = es.create(index="my_users", id="user2", document=doc3)print(f"文档 'user2' 创建成功: {response['result']}")
except elasticsearch.ConflictError:print(f"创建文档 'user2' 失败: 文档已存在。")
except Exception as e:print(f"创建文档 'user2' 失败: {e}")

关键点:

  • index="your_index_name": 指定要在哪个 Index 中操作,类似于 SQL 中的表名。如果 Index 不存在,ES 通常会自动创建它(根据配置)。
  • id="your_document_id": 可选,指定文档的 _id
  • document=your_document_data: 要插入的文档内容,是一个 Python 字典。
  • es.index() 是最常用的方法,兼具创建和更新功能。
  • es.create() 仅用于创建,如果文档ID已存在则会失败。

查 (Read / Get / Search) - 查询数据

ES 的查询功能非常强大,远超 SQL 的 SELECT

1. 按 ID 获取文档 (类似于 SELECT ... WHERE id = ...)

-- SQL
SELECT * FROM users WHERE id = 'user1';

Elasticsearch Python 实现:

try:response = es.get(index="my_users", id="user1")if response['found']:print("根据 ID 获取文档成功:")print(response['_source']) # '_source' 包含了文档的实际内容else:print("未找到文档 'user1'")
except elasticsearch.NotFoundError:print("文档 'user1' 未找到。")
except Exception as e:print(f"获取文档 'user1' 失败: {e}")

2. 搜索文档 (类似于 SELECT ... WHERE condition ...)

ES 使用一种称为 Query DSL (Domain Specific Language) 的 JSON 结构来定义复杂的搜索查询。

简单示例:查询 my_users 索引中 name 字段为 “张三” 的所有用户。

-- SQL (简单类比)
SELECT * FROM users WHERE name = '张三';

Elasticsearch Python 实现 (使用 Match Query):

search_query_simple = {"query": {"match": {"name": "张三" # 查询 name 字段中包含 "张三" 的文档}}
}try:response = es.search(index="my_users", body=search_query_simple)print(f"搜索到 {response['hits']['total']['value']} 个文档:")for hit in response['hits']['hits']:print(f"  ID: {hit['_id']}, Score: {hit['_score']}, Source: {hit['_source']}")
except Exception as e:print(f"搜索文档失败: {e}")# 更复杂的示例:查询 age 大于 28 的用户
search_query_range = {"query": {"range": {"age": {"gt": 28 # gt = greater than}}}
}
try:response = es.search(index="my_users", body=search_query_range)print(f"\n搜索年龄大于 28 的用户,共 {response['hits']['total']['value']} 个:")for hit in response['hits']['hits']:print(f"  ID: {hit['_id']}, Source: {hit['_source']}")
except Exception as e:print(f"范围搜索失败: {e}")# 获取所有文档 (类似于 SELECT * FROM table,但不推荐用于大数据量)
try:# 注意:对于非常大的索引,避免使用 match_all 不加分页或限制# 这里可以添加 size 参数来限制返回数量,例如 size=10response_all = es.search(index="my_users", query={"match_all": {}}, size=10)print(f"\n获取 'my_users' 索引中的前10个文档 (或所有,如果少于10个):")for hit in response_all['hits']['hits']:print(f"  ID: {hit['_id']}, Source: {hit['_source']}")
except Exception as e:print(f"获取所有文档失败: {e}")

关键点:

  • es.get(): 通过 _id 精确获取单个文档。
  • es.search(): 执行搜索查询。
  • bodyquery 参数: 包含用 Query DSL 定义的查询体。
  • Query DSL 非常灵活,支持全文搜索、布尔查询、范围查询、聚合等。你需要花时间学习它。

改 (Update) - 更新数据

更新文档可以通过 es.update() 方法,或者用 es.index() 覆盖(如果 _id 已存在)。es.update() 更灵活,可以部分更新文档。

类比 SQL 的 UPDATE

-- SQL
UPDATE users SET age = 31, city = '北京' WHERE id = 'user1';

Elasticsearch Python 实现:

# 1. 部分更新文档 (只更新指定字段)
update_body_partial = {"doc": { # "doc" 关键字表示部分更新"age": 31,"city": "北京"}
}
try:response = es.update(index="my_users", id="user1", body=update_body_partial)print(f"文档 'user1' 部分更新成功: {response['result']}")
except elasticsearch.NotFoundError:print(f"更新失败:文档 'user1' 未找到。")
except Exception as e:print(f"更新文档 'user1' 失败: {e}")# 2. 使用脚本更新 (例如,给年龄增加1)
update_body_script = {"script": {"source": "ctx._source.age += params.increment", # ctx._source 指向文档内容"lang": "painless", # ES 默认的脚本语言"params": {"increment": 1}}
}
try:# 假设 user1 之前年龄是 31, 更新后会是 32response = es.update(index="my_users", id="user1", body=update_body_script)print(f"文档 'user1' 通过脚本更新成功: {response['result']}")# 验证更新updated_doc = es.get(index="my_users", id="user1")print(f"更新后的文档 'user1': {updated_doc['_source']}")
except elasticsearch.NotFoundError:print(f"脚本更新失败:文档 'user1' 未找到。")
except Exception as e:print(f"脚本更新文档 'user1' 失败: {e}")# 3. 通过 index API "覆盖" 更新 (整个文档替换)
# 如果 user1 存在,这会完全替换它的内容
doc_override = {"name": "张三丰", "age": 100, "skill": "太极"}
try:response = es.index(index="my_users", id="user1", document=doc_override)print(f"文档 'user1' 通过 index API 覆盖更新成功: {response['result']}") # result 会是 'updated'
except Exception as e:print(f"通过 index API 覆盖更新 'user1' 失败: {e}")

关键点:

  • es.update(): 用于部分更新或使用脚本更新。
    • body={"doc": {"field_to_update": "new_value"}}: 部分更新。
    • body={"script": ...}: 使用脚本更新,更灵活。
  • es.index(): 如果 _id 已存在,它会完全替换现有文档。

删 (Delete) - 删除数据

类比 SQL 的 DELETE

-- SQL
DELETE FROM users WHERE id = 'user2';

Elasticsearch Python 实现:

try:response = es.delete(index="my_users", id="user2")if response['result'] == 'deleted':print(f"文档 'user2' 删除成功.")elif response['result'] == 'not_found':print(f"删除失败:文档 'user2' 未找到。")else:print(f"删除文档 'user2' 的结果: {response['result']}")
except elasticsearch.NotFoundError:print(f"删除失败:文档 'user2' 未找到。")
except Exception as e:print(f"删除文档 'user2' 失败: {e}")# 验证删除
try:es.get(index="my_users", id="user2") # 应该会抛出 NotFoundError
except elasticsearch.NotFoundError:print("文档 'user2' 已被成功删除,验证通过。")
except Exception as e:print(f"验证删除时发生错误: {e}")

删除整个 Index (类似于 DROP TABLE)
警告:这个操作会删除 Index 内的所有数据且不可恢复!

# 谨慎操作!
try:# 假设我们想删除 my_logs 这个 indexif es.indices.exists(index="my_logs"):es.indices.delete(index="my_logs")print("Index 'my_logs' 删除成功。")else:print("Index 'my_logs' 不存在,无需删除。")
except Exception as e:print(f"删除 Index 'my_logs' 失败: {e}")

pymysql 的主要区别和 ES 特点

  1. Schema (结构):

    • MySQL: Schema-on-write (写时定义结构)。在插入数据前必须定义表结构和字段类型。
    • Elasticsearch: Schema-on-read (读时推断结构) 或 Schema-free (更准确的说是动态映射)。ES 可以根据你插入的第一个文档动态创建 Mapping (映射,即表结构)。你也可以预先定义 Mapping 以获得更精确的控制。这提供了更大的灵活性。
  2. 数据类型:

    • MySQL 有固定的数据类型 (INT, VARCHAR, TEXT, DATETIME 等)。
    • ES 也有丰富的字段类型 (text, keyword, date, long, double, boolean, object, nested 等),特别为全文搜索和分析优化。例如 text 类型会进行分词处理以支持模糊搜索,而 keyword 类型则不分词,用于精确匹配、排序和聚合。
  3. 查询语言:

    • MySQL: SQL (Structured Query Language),声明式语言。
    • Elasticsearch: Query DSL (基于 JSON),非常强大和灵活,专为搜索和分析设计。学习曲线比 SQL 陡峭一些,但功能更强大。
  4. 事务 (Transactions):

    • MySQL: 支持 ACID 事务,保证数据一致性。
    • Elasticsearch: 本质上是分布式的,不支持传统意义上的跨多个文档的 ACID 事务。它在单个文档级别保证原子性。对于需要复杂事务的场景,ES 可能不是最佳选择。
  5. 主要用途:

    • MySQL: 适合作为 OLTP (在线事务处理) 系统,结构化数据存储,关系型数据管理。
    • Elasticsearch: 强大的搜索引擎,日志分析,实时数据分析,地理空间数据搜索等。它非常擅长处理大量非结构化或半结构化数据,并提供快速的搜索和聚合能力。
  6. API:

    • pymysql 通过 Python DB-API 规范与 MySQL 交互。
    • Elasticsearch Python 客户端通过 HTTP/HTTPS 与 ES 的 REST API 进行通信。ES 的所有操作都是通过 RESTful API 暴露的。

总结和建议

  • 从小处着手: 先掌握基本的 index, get, search (match query), update, delete 操作。
  • 学习 Query DSL: 这是发挥 ES强大搜索能力的关键。官方文档是最好的学习资源。
  • 理解 Mapping: 了解不同字段类型 (text vs keyword 非常重要) 如何影响搜索和聚合。
  • 考虑数据建模: 虽然 ES 灵活,但好的数据建模(如何组织 Index 和 Document)仍然重要。

希望这个教程能帮助你顺利上手 Elasticsearch!如果你在实践中遇到具体问题,可以随时提问。

http://www.dtcms.com/wzjs/574437.html

相关文章:

  • 接做网站的私活怎么报价自己搭建云平台
  • 上海制作网站公司网站长沙功能网站建设
  • 制作网站题材免费ppt模板下载哪个网站好
  • 龙岗网站制作培训班企业管理软件定制开发
  • 企业如何进行搜索引擎优化重庆百度整站优化
  • 南山的网站建设公司科技公司手机网站
  • 衡水建设投资集团网站网页设计结课论文
  • 国内做网站的大公司有哪些最新网站信息
  • 淘宝客怎么在网站做推广汉中建设工程招投标
  • 郑州 网站建设网站的企业特色展示
  • 徐州网站关键词刀模 东莞网站建设
  • 各大网站logo图标网页版抖音入口官网
  • 网站开发(定制)合同 模板微信企业官方网站怎么做
  • 湛江专业建网站哪家好名表网站
  • 网站怎么去优化网站建设佰首选金手指二七
  • 邯郸网站制作与建设网站设计一般什么字体
  • 数据分析网站html模板下载做网站约需要多少钱
  • 电子商务网站建设实训报告总结网站建设 售后服务
  • 网站管理助手 ftp个人网站开发的现状
  • 电子商务网站建设考卷wordpress 解释符号
  • wordpress 5郑州seo哪家公司最强
  • 四川建设网入川备案网站服务器里面如何做网站
  • 江苏省建设工程地方标准网站推广资源网
  • 深圳论坛网站建设广州电商运营培训哪个机构好
  • 手工做的网站在seo优化中
  • 建站公司哪个好学校网站结构图
  • 网站推广基本方法好上手的做海报网站
  • 中小型网站建设平台外文网站搭建公司
  • 云南网站建设的价值论客企业邮箱官网
  • 如何提高网站点击率wordpress主题太臃肿