美文网首页
Elasticsearch 搜索文档

Elasticsearch 搜索文档

作者: JaJa大宝剑 | 来源:发表于2018-07-10 16:41 被阅读0次

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种了,基本就看到这里,要熟悉业务去了。

相关文章

网友评论

      本文标题:Elasticsearch 搜索文档

      本文链接:https://www.haomeiwen.com/subject/hidfpftx.html