上篇文章中,我们介绍了简单的查询。在Elasticsearch中有两种最基本的查询方式:
1、通过REST请求把搜索参数放到请求的URL中。
2、另一种是通过个REST请求,把请求参数放到请求的body中。
第二种方式可以以JSON的方式进行提交搜索,更有利于阅读。
第一种方式的搜索需要在URL中指定_search参数。
例如:GET localhost:9200/customer/_search?q=*&pretty
这个搜索可以得出customer中的所有文档。
解释一下:_search是搜索的关键字,q=*表示搜索所有文档,&pretty表示输出的结果是经过格式化后的,这样阅读起来更直观。
下面是我这里返回的结果:
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 2, "max_score" : 1.0, "hits" : [ { "_index" : "customer", "_type" : "external", "_id" : "1", "_score" : 1.0, "_source" : { "name" : "secisland Doe" } }, { "_index" : "customer", "_type" : "external", "_id" : "3", "_score" : 1.0, "_source" : { "name" : "John Doe" } } ] } }
关键内容解释如下:
took: Elasticsearch执行搜索的时间,以毫秒为单位。
timed_out:告诉我们这次搜索是否超时。
_shards:告诉我们这次的搜索在多少个分片中进行了查找,搜索成功或者失败分片的个数。
hits:搜索的具体结果。
hits.total:根据搜索条件匹配的文件总数。
hits.hits:实际搜索的文档内容(默认为搜索前10个文档)。
_score和max_score是搜索结果匹配相关度的数值,这个在后面会详细解释。
下面我们用第二种方法进行搜索:
请求:POST localhost:9200/bank/_search?pretty
参数:
{ "query": { "match_all": {} } }
返回的结果和第一种查询的内容一模一样。
这两个查询的区别是:
第一种是GET请求,在URL中传递q=*参数:
第二种是POST请求,在body中通过JSON格式的进行查询。
需要注意的是,Elasticsearch的查询和数据的查询在后台是不一样的,对于数据库后台查询保留了游标等信息方便进一步的查询,Elasticsearch查询是一次完全独立的查询,后面没有保留任何信息。
本文由赛克蓝德(secisland)原创,转载请标明作者和出处。
Elasticsearch提供JSON风格的特定领域语言(domain-specific language 简称DSL),可以使用DSL执行查询。Elasticsearch这种特定领域语言查询简称Query DSL。这种查询的功能非常强大。下面通过例子进行介绍。
我们看一下上面的第二个查询的例子:
{ "query": { "match_all": {} } }
对上面的内容进行分析,我们定义了一个简单的查询,是匹配所有内容的查询条件。match_all表示在指定的索引中搜索全部的文档。除了query参数,我们还可以通过其他参数来影响搜索结果。例如,以下是一个match_all并且只返回第一个文档:
{ "query": { "match_all": {} }, "size": 1 }
注意:如果没有指定size参数,则默认为10。
下面的例子我们进行match_all匹配并返回第11条到20条的文档:
{ "query": { "match_all": {} }, "from": 10, "size": 10 }
参数from指定的索引文件从哪一条开始,size参数指定需要返回多少条文档。这种搜索条件长用在分页搜索的情况下。注意:如果from参数没有指定,默认为0。
下面的例子match_all匹配所有的文档,同时对balance进行了降序排序,返回经过排序后的前10条文档。
{ "query": { "match_all": {} }, "sort": { "balance": { "order": "desc" } } }
赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待,也欢迎加入secisland公众号进行关注。