你可以这么形容 Elasticsearch :
Elasticsearch 是一个实时分布式搜索和分析引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上,而 Lucene 是当下最先进、高性能、全功能的搜索引擎库。
但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。因为 Lucene 非常复杂。
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
Elasticsearch 不仅用于大型企业,它还让像 DataDog 以及 Klout 这样的创业公司将最初的想法变成可扩展的解决方案,Elasticsearch 可以在你的笔记本上运行,也可以在数以百计的服务器上处理 PB 级别的数据。
JSON 格式,Elasticsearch 存储的最小单位,可以理解为是关系型数据库中的一条记录,每个文档都有自己的一个 unique id。
文档元数据,用于标注文档的相关信息
索引是文档的一个容器,类比于关系型数据库的数据库概念,索引中的 setting 里定义有多少个 shards 来存储索引数据,数据是如何分布。
因此 每个索引(Index)包含多个类型(Type),不同的类型存储着多个文档(Document),每个文档又有多个属性(Field)
一个节点是一个 Elasticsearch 实例。Master节点,主要负责索引创建删除,维护集群中节点。分片分配;Data节点,存储数据节点;协调节点,负责接收客户端请求,分发请求到其他节点最后将数据汇集响应给客户端;
Elasticsearch 是面向文档的,使用 JSON 作为文档的序列化格式,而且 Elasticsearch 不仅存储文档,还索引每个文档的内容,使之可以被检索、排序和过滤,而这也是 Elasticsearch 能支持复杂全文检索的原因。
我们可以使用 RESTful API 通过端口 9200(默认)和 Elasticsearch 进行通信,可以使用 kibana 访问 Elasticsearch ,甚至可以直接使用 curl 命令来和 Elasticsearch 交互。
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB:适当的 HTTP 方法或谓词 : GET、POST、PUT、HEAD 或者 DELETE。 PROTOCOL:http 或者 https。 HOST:Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 PORT:Elasticsearch HTTP 服务的端口号,默认是 9200. PATH:API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。 QUERY_STRING:可选,查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读) BODY:可选,一个 JSON 格式的请求体
更多 DSL 语法可以参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/search-search.html
如果你正在使用 Java,在代码中你可以使用 Elasticsearch 内置的两个客户端:
节点客户端(Node client) 节点客户端作为一个非数据节点加入到本地集群中。换句话说,它本身不保存任何数据,但是它知道数据在集群中的哪个节点中,并且可以把请求转发到正确的节点。
传输客户端(Transport client) 轻量级的传输客户端可以将请求发送到远程集群。它本身不加入集群,但是它可以将请求转发到集群中的一个节点上。
两个 Java 客户端都是通过 9300 端口并使用 Elasticsearch 的原生传输协议和集群交互。集群中的节点通过端口 9300 彼此通信。如果这个端口没有打开,节点将无法形成一个集群。