Elasticsearch初体验

来源:互联网 发布:孔莹网络春晚 编辑:程序博客网 时间:2024/05/16 09:49

  Elasticsearch是一个分布式的RESTful风格的搜索和数据分析引擎。个人理解的Elasticsearch和传统的关系型数据库的最大区别在于,它可以进行结构化搜索,全文检索以及对数据进行分析。这篇文章简单地介绍一下如何在linux环境下通过curl命令完成Elasticsearch RESTful API功能。
  
  一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:

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

  介绍一下被 < > 标记的部件:

VERB
  适当的 HTTP 方法 或 谓词 : GETPOSTPUTHEAD 或者 DELETE

PROTOCOL
  http 或者 https(如果你在 Elasticsearch 前面有一个https 代理)

HOST
  Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。

PORT
  运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。

PATH
  API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。

QUERY_STRING
  任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)

BODY
  一个 JSON 格式的请求体 (如果请求需要的话)
  
  下面仅以查询功能为例,例如可以通过如下命令获取集群中文档的数量:

curl -XGET 'http://localhost:9200/_count?pretty' -d '{    "query": {        "match_all": {}    }}'

  注意根据你的情况修改ip地址和端口号,正常情况会返回一个类似与下面的json对象:

{  "count" : 17,  "_shards" : {    "total" : 1,    "successful" : 1,    "failed" : 0  }}

  现在,在我的本地,我可以根据下面的命令获取到一些信息:

curl -XGET 'http://localhost:9200/method_invocation_b/default/AV4tSzEKxwX4VBM9JTI-?pretty'

返回如下:

这里写图片描述

  在命令中,method_invocation_b是一个索引。索引这个词在 Elasticsearch 语境中包含多重意思, 所以有必要做一点儿说明:(下面这段话引自Elasticsearch官方文档)

索引(名词):

如前所述,一个索引类似于传统关系数据库中的一个数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices或 indexes 。

索引(动词):

索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT关键词,除了文档已存在时新文档会替换旧文档情况之外。

倒排索引:

关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。

默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。我们将在 倒排索引 讨论倒排索引的更多细节。

  命令中的索引明显指的是名词索引,可以理解为这个值定位到一个我本地的数据库method_invocation_b,再之后的default是类型名称,这里是默认类型,随后的AV4tSzEKxwX4VBM9JTI-是记录的id。返回结果中的_source域是这次查询结果的具体信息(仅是我在本地存储的一些数据)。
  
  下面尝试用另外一种方式搜索索引method_invocation_b下default类型的全部数据,命令如下:

curl -XGET 'http://localhost:9200/method_invocation_b/default/_search?pretty'

  返回如下:

这里写图片描述
  可以看到,我们仍然指定了索引method_invocation_b和类型default,但是没有指定一个id,而是使用了_search。从返回结果可以看到有1756180条符合查询条件的记录,但是一次搜索默认只返回10条结果。

  接下来,我们尝试搜索methodDictId为32093的数据,这个方法一般涉及到一个查询字符串 (query-string)搜索,因为我们通过一个URL参数来传递查询信息给搜索接口,命令如下:

curl -XGET 'http://localhost:9200/method_invocation_b/default/_search?q=methodDictId:32093&pretty'

  返回如下:
  这里写图片描述

  使用查询字符串搜索很方便,但是它有自身的局限性,Elasticsearch还提供一个丰富灵活的查询语言叫做 查询表达式,它支持构建更加复杂和健壮的查询。它指定使用一个json对象封装查询的条件,例如,我们也可以通过如下的命令达到上述的搜索结果:

curl -XGET 'http://localhost:9200/method_invocation_b/default/_search?pretty' -d '{        "query": {                "bool": {                                         "must": {                                                        "match": {                                                             "methodDictId": {                                                       "query": 33396,                                                "type": "phrase"                                        }                                }                        }                }        }}'

  返回结果同之前一样:
  
  这里写图片描述
  
  (这里提供一个链接,可以将sql语句转换为json字符串:http://www.nlpcn.org:9999/web/)
  
  命令中使用了match查询,这是查询类型的一种,还有其他的查询类型会在后面继续介绍。

原创粉丝点击