Elasticsearch 搜索文档

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 探索你的数据 样本数据集 现在我们对于基本的东西已经有了一些感觉,现在让我们尝试使用一些更加贴近现实的数据集。我已...
    Jason__Ding阅读 405评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,629评论 18 139
  • 博客原文一博客原文二 翻译作品,水平有限,如有错误,烦请留言指正。原文请见 官网英文文档 起步 Elasticse...
    rabbitGYK阅读 3,230评论 0 68
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,905评论 2 89
  • 总以为心灵的痛 无法修复 原来生孩子也可以这样 没有人告诉我 她只是默默的承受着 不言不语 只有痛苦的面孔 仰头看...
    布老头和他的家人们阅读 130评论 0 0