ES

它是一个 分布式的 全文搜索与数据分析引擎。

与关系型数据库对比:
一个ES集群可以包含多个索引(数据库),每个索引又包含了很多类型(表),类型中包含了很多文档(行),每个文档使用 JSON 格式存储数据,包含了很多字段(列)

基本操作:

连接:

安装

pip install elasticsearch

连接


from elasticsearch import Elasticsearch# 实例化
es = Elasticsearch([{"host": "ip", "port": 9200}])

插入:

创建数据库

es.indices.create(index="index_name", ignore=400)

创建数据库,并忽略400错误(数据库重复时,会返回400)

插入数据

body = {"name": "李李小明","age": 7,"sex": "male"
}es.index(index="es_test", doc_type='_doc', body=body)

插入多条

doc = [{"index": {'_index': "es_test", "_type": '_doc', '_id': 1}},{"name": "王王大志", "age": 8, "sex": "male"},{"index": {'_index': "es_test", "_type": '_doc', '_id': 2}},{"name": "刘刘大彪", "age": 8, "sex": "male"},{"index": {'_index': "es_test", "_type": '_doc', '_id': 3}},{"name": "赵赵灵儿", "age": 7, "sex": "male"},
]es.bulk(index='es_test', doc_type='_doc', body=doc)

查询:

基本命令


# 返回字段
filter_path = ['hits.hits._source.ziduan1'
]# 查询内容 过滤条件
body = {"from": 0,"size": 10
}es.search(index='es_python', filter_path=filter_path, body=body)

from, size 类似于 limit 0, 10

各种查询方式:
body 用法

模糊查询:match

body = {"query": {"match": {"name": "王"}},"size": 10
}

模糊匹配 字段 name 中有王的 文档。

精确查询: term

body = {"query": {"term": {"name.keyword": "刘刘大彪"}},"size": 10
}

精确多值查询:terms

body = {"query": {"terms": {"name.keyword": ["刘刘大彪", "赵赵灵儿" ]}},"size": 10
}

注意是或的关系

模糊多字段查询:multi_match

body = {"query": {"multi_match": {"query": "大""fields":["name", "info"] # 指定字段}},"size": 10
}

前缀查询:prefix

body = {"query": {"prefix": {"name.keyword": "王"}},size: 20
}

其他类似
通配符查询:wildcard
正则查询:regexp

布尔关系: bool

  • must 相当于and
  • should 相当于 or
  • *_not 取反,
  • 支持嵌套
body = {"query": {"bool": {"must": [{"term": xxxxxxxx},{"prefix": xxxx},{"bool": {"should": [{"term": xxxxxx},{"term": xxxxxx}]}}]}}
}

连接池

import os
import json
from datetime import datetime
from elasticsearch import Elasticsearch, RequestsHttpConnection
from elasticsearch import Transport
from elasticsearch.exceptions import NotFoundErrorpool = Transport(hosts=hosts, connection_class=RequestsHttpConnection).connection_poolconn = pool.get_connection()

一个工具类: 写的不错,直接就复制过来了

小建议: 对于查询直接写成对应函数,并提供连接池管理。

import os
import json
from datetime import datetime
from elasticsearch import Elasticsearch, RequestsHttpConnection
from elasticsearch import Transport
from elasticsearch.exceptions import NotFoundErrorclass ES(object):_index = ""_type = ""def __init__(self, hosts):# 基于requests实例化es连接池self.conn_pool = Transport(hosts=hosts, connection_class=RequestsHttpConnection).connection_pooldef get_conn(self):"""从连接池获取一个连接"""conn = self.conn_pool.get_connection()return conndef request(self, method, url, headers=None, params=None, body=None):"""想es服务器发送一个求情@method     请求方式@url        请求的绝对url  不包括域名@headers    请求头信息@params     请求的参数:dict@body       请求体:json对象(headers默认Content-Type为application/json)# return    返回体:python内置数据结构"""conn = self.get_conn()try:status, headers, body = conn.perform_request(method, url, headers=headers, params=params, body=body)except NotFoundError as e:return Noneif method == "HEAD":return statusreturn json.loads(body)def search(self, query=None, method="GET"):url = "/%s/%s/_search" % (self._index, self._type)if method == "GET":data = self.get(url, params=query)elif method == "POST":data = self.post(url, body=query)else:return Nonereturn datadef get(self, url, params=None, method="GET"):"""使用get请求访问es服务器"""data = self.request(method, url, params=params)return datadef put(self, url, body=None, method="PUT"):"""使用put请求访问es"""data = self.request(method, url, body=body)return datadef post(self, url, body=None, method="POST"):"""使用post请求访问服务器"""data = self.request(method, url, body=body)return datadef head(self, url, *args, **kwargs):status = self.request("HEAD", url, *args, **kwargs)return statusdef delete(self, url, *args, **kwargs):ret = self.request("DELETE", url, *args, **kwargs)return ret

进阶

es 做到数十亿数据查询毫秒级响应

往es中写文件 最终是保存在硬盘上, 查询的时候 是从硬盘上读数据。然而:

操作系统会把从硬盘上读出的数据放到filesystem cache 中, 下次读取的时候直接从缓存中取数据, 从内存中取数据明显要快于从硬盘读取,性能会得到极大的提升。

所以在设计(调优)时:

首先:硬件方面
一般至少确保60% - 80% 的数据能够缓存到 系统缓存中, 这样整个系统性能才能有保证。 并且尽量保证运行es 的机器上 不运行其他程序,避免cpu 与内存的争用。

其次: 设计方面
冷热分离,在某些情况下, 数据确实很多,不能将大部分数据放大系统缓存。根据业务场景,一般热数据占比是比较少的, 也就是大量数据中,经常访问的数据量不多,但这批数据访问频次很高。所以只要保证将这批热数据放到系统缓存中,就能保证系统中大部分用户的使用体验。
因此,可以将es中冷热数据分离,给他们分配单独机器,并适当调大内存,保证热数据访问效率。 对于剩下的大批冷数据可以 放到另外机器中,虽然查询会多花费一些时间,但这些是一小批用户。 对于系统整体来说,在设备条件有限的情况下 能最大程度使用硬件。

再者:编码方面
文档设计方面,在机器性能有限的情况下, 应避免存放与查询无关的内容,尽可能减小单个文档大小,增大缓存文档数量。
例如: 商品搜索中,只存放 id title keyword, 每次查询,根据条件查询出商品id ,然后根据id 从其他数据库中查询出详细信息。

另外为提升用户体验,可以进行数据预热,始终保证大部分热数据存在于系统缓存中。

分页性能优化,使用scroll , 一页一页 返回, 并对分页深度进行限制。

另外,集群条件下,提高系统查询效率,可以多添加一些副本,分担系统压力。


问题: 分布式查询数据,较深的分页 为什么性能很差

问题: 怎么找出系统热数据


参考文章: xx 官方文档

ES 全文搜索与数据分析引擎相关推荐

  1. Java小白学习指南【day54】---luceneElasticSearch全文搜索

    文章目录 lucene&ES全文搜索 一.认识全文搜索引擎 1.什么是全文搜索 2.全文检索的特点 3.常见的全文索引 二.Lucene介绍 1.Lucene是什么 2.Lucene的核心 3 ...

  2. 使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序 --作者:Andrew B. Cencini...

    [摘要]了解如何充分利用SQL Server 2000的全文搜索功能.本文包含有关实现最大吞吐量和最佳性能的几点提示和技巧. 概述 使用Microsoft© SQL Server 2000的全文搜索功 ...

  3. 帝国CMS7.5基于es(Elasticsearch)7.x的全文搜索插件

    帝国CMS7.5基于es(Elasticsearch)7.x的全文搜索插件 - GXECMS博客 一.插件演示地址 后台演示地址:https://ecms.gxecms.cf/e/admin/inde ...

  4. Java全文搜索怎么弄的_全文搜索 简介

    数据的分类 结构化数据 具有固定格式.有限⻓度的数据,一般用关系数据库来处理. 非结构化数据 全⽂数据,⽆固定格式.不定⻓,比如邮件.word⽂档内容. 非结构化数据的2种处理方式 顺序扫描 从前往后 ...

  5. Flask 教程 第十六章:全文搜索

    本文转载自:https://www.jianshu.com/p/56cfc972d372 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblog添加全文搜索功能. ...

  6. 全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定

    转载自  全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定 摘自:JaJian`博кē Java后端技术编者说:文章从浅到深,描述了什么是全文搜索,为什么要使用全文搜索,Solr ...

  7. 图文详解 DBMS 数据库管理系统三层架构体系(三级模式)《ClickHouse 实战:企业级大数据分析引擎》...

    引文 计算机科学领域的所有问题,都可以通过添加一层中间层来解决.通过在用户和计算机中间添加一层逻辑层(概念模型层),于是就有了"数据库的三级模式":数据库在三个级别 (层次)上进行 ...

  8. 分布式全文搜索服务Elasticsearch

    1.ElasticSearch简介 1.1 什么是ElasticSearch Elasticsearch,简称为es,是一款开源的高扩展的分布式全文搜索服务,它可以近乎实时的检索数据:本身扩展性很好, ...

  9. 如虎添翼!一款强大的本地文件全文搜索工具

    ↑↑↑关注后"星标"简说Python 人人都可以简单入门Python.爬虫.数据分析 简说Python推荐来源:平凡而诗意 作者:JackpopOne old watch, lik ...

最新文章

  1. 北师大历史系65 级同学聚会宁夏【之七】——在中阿之轴、西夏王陵、董府、板桥道堂、鸿乐府及告别宴会...
  2. Spring思维导图(MVC篇)
  3. Gentoo 安装日记 10 (配置内核 :General setup)
  4. SAP Spartacus 默认的 pwa,处于关闭状态还是打开状态?
  5. 3d需要学linux_我的脑子—从核磁共振图像到3D打印
  6. 神奇的国度(HYSBZ-1006)
  7. mysql json数组拆分表_MaxCompute将json数组拆分成多行
  8. 威纶通定时循环操作宏_威纶通触摸屏宏指令的使用
  9. redis key命名规范_redis简介
  10. WSDM2022 | 数据困境: 我们究竟有多了解推荐系统数据集?(附视频、论文及代码)...
  11. MYSQL重置密码遇到ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor:yes)问题
  12. CodeForces-28C-Bath Queue-概率DP[ ICPC2016大连热身D]
  13. 项目管理10大模板Excel版(可直接套用)
  14. 红帽子 linux 声卡驱动,RedHat Linux系统下安装ALSA驱动的方法
  15. PIC12F508 单片机使用教程
  16. 服务器系统更新后找不到硬盘,重装win10系统找不到硬盘完美解决方法
  17. 如何实时获取当前时间
  18. python统计元音字母个数_Quzh[python]统计元音字母——输入一个字符串,统计处其中元音字母的数量。...
  19. Datahero inc智能合约技术重塑供应链金融模式
  20. 给我一把利剑,待我重整山河

热门文章

  1. Mysql中的flush privileges语句
  2. 实战:ingress-nginx 高级配置1-2022.1.5
  3. 使用icecast搭建在线电台并使用ffmpeg推流
  4. 2020年中国空气压缩机行业发展现状、竞争格局及未来发展趋势分析,国内市场竞争激烈,市场规模将破600亿元「图」
  5. 【C语言】几道C/C++面试题解析
  6. 流利阅读 2019.3.3 Alita: Battle Angel review—lovestruck tweenies do battle in robot dystopia
  7. 大连 Oracle LMS,oracle rac后台进程和LMS说明
  8. 蚂蚁金服智能推荐引擎解决方案与实践 1
  9. ipad2018电池测试软件,2018款iPad Pro内部做工值得买吗?iPad Pro 2018详细拆机图解评测...
  10. 时间差之天数计算Python