Loading the Sample Dataset加载样例数据
首先下载json数据
https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json
下载下来保存为json文件,然后在json文件目录上用curl上传。
curl -H "Content-Type: application/json" -XPOST "user:password@localhost:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"
The Search API
Searches方法有两种方式,一种是使用REST request URL,另外一种是使用REST request body,使用REST request body可以用更容易读懂的JSON格式定义搜索。
REST request URL方式搜索:
GET /bank/_search?q=*&sort=account_number:asc&pretty
让我们来解析下参数:
_search代表是search操作,然后q=*参数代表ElasticSearch将匹配这个index中的所以document,然后参数sort=account_number:asc代表使用account_number这个field去排序,使用ascending(向上的)排序方式。pretty表示返回pretty-printed的JSON。
接下来解析响应的文本。
- took -代表所使用的的时间。
- time_out -告诉我们有没有超时
- _shards -告诉我们多少个片区被搜索过,多少个片区成功搜索过
- hits -搜索结果
- hits.total -多少个document匹配我们的搜索范围
- hits.hits -实际搜索结果的数组。默认是10个documents。
- hits.sort - 结果排序的索引号。
- hits._score跟max_sorce -暂时忽略这个东东。
使用REST request body请求示例:
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
这里跟在URL中请求不一样,我们提供了一个JSON格式的请求查询体给_search API。在下一节我们将讨论这个Json 查询。
一旦查询完成,ElasticSearch将不维护任何游标(或分页)这种。跟SQL平台的不一样。
Introducing the Query Language
ElasticSearch提供了一种JSON风格的特定域语言DSL,可以用来执行查询。
回顾上面的例子,我们执行查询:
GET /bank/_search
{
"query": { "match_all": {} }
}
这个例子只是简单的使用query:match_all
查询匹配全部的document。实际上,我们还可以给query添加其他参数,通过其他参数来影响搜索结果,例如sort,size,from这种。
如果size没有声明,它的默认值是10.
from声明从哪里开始。
GET /bank/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 10
}
from默认值是0.
GET /bank/_search
{
"query": { "match_all": {} },
"sort": { "balance": { "order": "desc" } }
}
这个例子表明匹配全部,使用balance这个field进行排序,返回前十个hit(size默认是10)
Executing Searches
进一步研究Query DSL。
通常,查询返回的是full JSON document,它通常在_source field中映射。如果我们只需要特定的字段,则可以限定返回的字段。
GET /bank/_search
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}
这个跟SQL中的SELECT字段表差不多。
特定字段查询
GET /bank/_search
{
"query": { "match": { "account_number": 20 } }
}
只匹配account_number为20的documents。
GET /bank/_search
{
"query": { "match": { "address": "mill" } }
}
address中包含mill的documents.
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
address中包含mill !!!或者 lane字段的document
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
address中包含 mill lane的document。
这几个例子要好好感悟。
bool query 布尔查询
布尔查询允许我们使用布尔逻辑较小的查询组成一个较大的查询。
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}
bool里面有一个程度参数,must,should,must_not
对应计算机逻辑的与或非三种逻辑,这个有点像高中的交集,并集,非子集这种。
Executing Filters
这里讲一个细节,document score(就是hit里面的_score field)。这个field代表document的匹配度,匹配度越高,_score越高。
但是查询并不是需要产生分手,特别是当查只用于“filtering”的document set时候,ElasticSearch检测这些情况,并自动优化查询执行,以避免产生无用的分数。
直接上例子,这里有一个叫range query的查询没有介绍过。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
上面这个例子中的bool query包含了一个match_all查询,和一个range query。我们可以 将其他的任何查询都替换到query和filter part中,上述的例子中,范围查询是非常有意义的。因为属于范围的文档都是!!!平等匹配的,没有任何一个document比另一个document更为重要。
除了match_all,match,bool,range之外,还有许多其他的查询方式是可以用的。当我们对他们的工作方式有了基本的了解,学习其他的方法也不困难。
Executing Aggregations(聚合)
聚合提供了从数据中分组和提供信息的能力。考虑聚合的最简单方法时将其大致等同于SQL的GROUP BY和SQL aggregate function。
在ElasticSearch中,可以执行搜索,然后多个搜索返回的结果聚合来。就是你可以运行多个查询和聚合,并一次性获取两个操作的结果,避免使用多个API进行网络返回。
一个简单的聚合实例
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
我们设置size=0是为了不显示搜索命中,因为我们不希望看到聚合结果。我们只希望看到聚合的结果。当然,size=0也可以取消。
聚合可以嵌套聚合。详情。。
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"meta" : { [<meta_data_body>] } ]?
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}
这个玩意确实很多内容,其中<aggregation_type>就有不下50种了,基本就看到这里,要熟悉业务去了。