elasticsearch入门

  • 2017-01-24 15:11:43
  • 2447
  • 0

前面已对elasticsearch做过简单的介绍:Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

一、定义:

  Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you to store, search, and analyze big volumes of data quickly and in near real time. It is generally used as the underlying engine/technology that powers applications that have complex search features and requirements.

二、解释:

 elasticsearch是一个高可扩展的开源全文搜索和分析引擎。它可以做到快速并接近于实时地存储、搜索和分析大容量数据。它通常被用作那些有复杂搜索特性和需求的大型应用的底层引擎(技术)。

三、知识过渡与整体理解:

 elasticsearch主要对象概念有:集群(cluster)、节点(node)、索引(index)、类型(type)、文档(document)、分片以及备份(Shards & Replicas)、字段(field)、mapping(字段类型映射)、结构体(dsl)等。

 集群:一个或者一个以上节点的集合,可以访问到全部的节点数据以及可以发送请求到该名下所有节点(即可以在所有节点上提供联合索引和搜索功能)。

 节点:是指一台服务器,可以存储数据、创建索引以及提供搜索功能。

 索引:是具有相似特性的文档集合。

 类型:官网没有确切的定义,一个索引可以包含一个或者一个以上的类型,可以理解成索引的逻辑类别/分区。

 文档:是指可以被索引的信息的基本单位。

 分片:由于索引可以存储大量的数据,这些数据可能超过单个节点的硬件限制, 因此Elasticsearch提供细分你的指标分成多个块称为碎片的能力。

 备份(副本)分片:顾名思义当主分片出现故障时, 将使用一套完整的副本分片进行工作。

 字段:一份文档由多个字段组成。

 字段类型映射:给文档的每个字段指定对应elastcisearch的数据类型。

 结构体:用于创建索引、查询、过滤等的结构化数据。

与最常用的关系型数据库对比如下: 

关系型数据库 数据库
ElasticSearch 索引 类型 文档 字段

另:es创建索引的方式是采取倒排索引的数据方式,而关系型数据库只是对特定的表字段创建索引且方式也有不同:如 B-Tree索引。

四、交互、语法指令以及查询结构体(DSL):

交互:如何与Elasticsearch交互取决于你是否使用Java,对于java用户有两种客户端:节点客户端(node client)与传输客户端(Transport client),这里不做详细讲解。

          这里主要介绍下另一种交互方式:基于HTTP协议,以JSON为数据交互格式的RESTful API其他所有程序语言都可以使用RESTful API,通过9200端口的与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,事实上,如你所见,你甚至可以通过curl命令与Elasticsearch通信。注:Elasticsearch官方提供了多种程序语言的客户端——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到。

语法指令:向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

结构体:结构体相当于上述语法指令中BODY, 三中已提到。

关于结构体首先要了解过滤与查询命令的区别:查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更耗时,并且查询结果也不可缓存,过滤语句的目的就是缩小匹配的文档结果集, 因此过滤语句不参与匹配度值的计算而查询语句的匹配与否会加入到匹配度的计算中。除上述区别外,查询语句与过滤语句的子句写法基本是一致的。关于查询和过滤子句的写法主要了解下以下几种命令的使用:

match:用于基本的匹配子句。

must:值为列表,表示其包含子句都必须全部满足,缺一不可。

should:值为列表, 表示只要满足其包含的部分子句即可,默认为1条,可通过变量minimum_should_match设定满足条数或者百分数

must_not:值为列表,表示其包含子句都必须全部不满足,满足任何一条都不可。
phrase_match:用于词组匹配子句,表示输入的词必须全部满足,词与词可以被其他词隔开,可通过变量slop来控制隔其他词的数量。

term:用于完全匹配子句,表示被匹配的内容必须完全与输入的匹配词一致。

dis_max:或查询,功能可以说与should 类似,一般用于得到多个搜索逻辑相差很大的搜索结果的并集。

另外and or等命令比较容易理解,用于匹配语句之中。

四、例子:

略,结合上述讲解的命令,基本已经能满足任何搜索需求了。如有问题可邮件联系。


 


发表评论

* *