一、Elasticsearch 简介你可以这么形容 Elasticsearch :
Elasticsearch 是一个实时分布式搜索和分析引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上,而 Lucene 是当下最先进、高性能、全功能的搜索引擎库。 但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为 Lucene 非常复杂。 Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
Elasticsearch 不仅用于大型企业,它还让像 DataDog 以及 Klout 这样的创业公司将最初的想法变成可扩展的解决方案,Elasticsearch 可以在你的笔记本上运行,也可以在数以百计的服务器上处理 PB 级别的数据。 二、Elasticsearch 安装三、Elasticsearch 基本概念文档(Document)JSON 格式,Elasticsearch 存储的最小单位,可以理解为是关系型数据库中的一条记录,每个文档都有自己的一个 unique id。 文档元数据,用于标注文档的相关信息
_score 相关度是一个很重要的概念,阐明了 Elasticsearch 在全文属性上搜索并返回相关性最强的结果,这是完全区别于传统关系型数据库的一个概念,数据库中的一条记录要么匹配要么不匹配。 文档(Document)是不可变的:它们不能被修改,只能被替换。因此对于 Document 的所有修改操作,在其内部都要经历检索-修改-重建索引的处理过程。 索引(Index)、类型(Type)索引(Index)是文档的一个容器,类比于关系型数据库的数据库概念,索引中的 setting 里定义有多少个 shards 来存储索引数据,数据是如何分布。
类型(Type)可以理解成关系型数据库中的 Table。 因此 每个索引(Index)包含多个类型(Type),不同的类型存储着多个文档(Document),每个文档又有多个属性(Field) 分片、副本一个运行中的 Lucene 实例称为一个分片,分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时,Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。 一个分片可以是主分片或者副本分片。 主分片用于解决水平扩展问题,将索引海量数据分布到集群内所有的节点之上(默认通过 id 的 hash),主分片在索引创建的时候确定,后续不允许修改(除非 Reindex 操作进行修改)。 副本分片是用于解决高可用问题,当主分配出现问题时,副本分片会被集群升级为主分片,副本分片个数的决定了写入性能和读取吞吐量,副本数量越多写入性能越差,但读取吞吐量就会越高,在运行中的集群上是可以动态调整副本分片数目的。
如果主分片和副本分片都集中在一个节点上,那是没办法做到高可用的。ES 的集群监控状态会返回 yellow(表示全部主分片都正常运行,副本分片没有全部处在正常状态)。因此,需要启动更多的节点来承载副本分片。 集群、节点一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成,它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。 Master 节点,负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等,而 Master 节点并不需要涉及到文档级别的变更和搜索等操作。 Data 节点,存储数据节点。 Coordinating (协调)节点,负责接收客户端请求,分发请求到其他节点,最后再将数据汇集响应给客户端。集群中得任何节点都可以作为协调节点,包括主节点,每个节点都知道任意文档所处的位置。 集群中的节点通过端口 9300 彼此通信。如果这个端口没有打开,节点将无法形成一个集群。 四、Elasticsearch 数据和检索Elasticsearch 是面向文档的,使用 JSON 作为文档的序列化格式,而且 Elasticsearch 不仅存储文档,还索引每个文档的内容,使之可以被检索、排序和过滤,而这也是 Elasticsearch 能支持复杂全文检索的原因。 在 Elasticsearch 中, 每个字段的所有数据都是默认被索引的。即每个字段都有为了快速检索设置的专用倒排索引。而且,不像其他多数的数据库,它能在同一个查询中使用所有这些倒排索引,并以惊人的速度返回结果。 我们可以使用 RESTful API 通过端口 9200(默认)和 Elasticsearch 进行通信,可以使用 kibana 访问 Elasticsearch ,甚至可以直接使用 curl 命令来和 Elasticsearch 交互。
更多 DSL 语法可以参考:https://www./guide/en/elasticsearch/reference/7.9/search-search.html 如果你正在使用 Java,在代码中你可以使用 Elasticsearch 内置的两个客户端:
两个 Java 客户端都是通过 9300 端口并使用 Elasticsearch 的原生传输协议和集群交互。 |
|
来自: python_lover > 《待分类》