Es学习第六课, ES基本搜索_search

前面几课ES的基本概念、安装和分词都讲过了,下面我们就来实战一下ES的核心功能-搜索,这节课我们主要讲的是基本搜索 _search(注意:ES的关键字都要加前缀_,所以我们在定义索引、类型名称时不要带_)。

我们先通过kibana插入几条三个文档

PUT /customer/doc/1?pretty
{
  "name": "John Doe"
}

POST /customer/doc/
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}

POST /website/blog/1/_update
{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}

_search

最基本的搜索API表单是空搜索(empty search),它没有指定任何的查询条件,只返回集群索引中的所有文档:

GET /_search

执行上面命令后会有下面返回结果:

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "customer",
        "_type": "doc",
        "_id": "gMHxC2cBvsiyaz9P4LEH",
        "_score": 1,
        "_source": {
          "title": "My second blog entry",
          "text": "Still trying this out...",
          "date": "2014/01/01"
        }
      },
      {
        "_index": "customer",
        "_type": "doc",
        "_id": "1",
        "_score": 1,
        "_source": {
          "name": "John Doe"
        }
      },
      {
        "_index": "website",
        "_type": "blog",
        "_id": "1",
        "_score": 1,
        "_source": {
          "title": "My first blog entry",
          "text": "Starting to get the this...",
          "views": 1,
          "tags": [
            "testing"
          ]
        }
      }
    ]
  }
}

针对上面返回结果,一些关键field的解释如下:

hits

响应中最重要的部分是hits,它包含了total字段来表示匹配到的文档总数,hits数组还包含了匹配到的前10条数据。

hits数组中的每个结果都包含_index_type和文档的_id字段,被加入到_source字段中这意味着在搜索结果中我们将可以直接使用全部文档。这不像其他搜索引擎只返回文档ID,需要你单独去获取文档。

每个节点都有一个_score字段,这是相关性得分(relevance score),它衡量了文档与查询的匹配程度。默认的,返回的结果中关联性最大的文档排在首位;这意味着,它是按照_score降序排列的。这种情况下,我们没有指定任何查询,所以所有文档的相关性是一样的,因此所有结果的_score都是取得一个中间值1

max_score指的是所有文档匹配查询中_score的最大值。

took

took告诉我们整个搜索请求花费的毫秒数。

shards

_shards节点告诉我们参与查询的分片数(total字段),有多少是成功的(successful字段),有多少的是失败的(failed字段)。通常我们不希望分片失败,不过这个有可能发生。如果我们遭受一些重大的故障导致主分片和复制分片都故障,那这个分片的数据将无法响应给搜索请求。这种情况下,Elasticsearch将报告分片failed,但仍将继续返回剩余分片上的结果。

timeout

time_out值告诉我们查询超时与否。一般的,搜索请求不会超时。如果响应速度比完整的结果更重要,你可以定义timeout参数为10或者10ms(10毫秒),或者1s(1秒)

GET /_search?timeout=10ms

多索引和多类别

你注意到空搜索的结果中不同类型的文档——usertweet——来自于不同的索引——usgb

通过限制搜索的不同索引或类型,我们可以在集群中跨所有文档搜索。Elasticsearch转发搜索请求到集群中平行的主分片或每个分片的复制分片上,收集结果后选择顶部十个返回给我们。

通常,当然,你可能想搜索一个或几个自定的索引或类型,我们能通过定义URL中的索引或类型达到这个目的,像这样:

/_search

在所有索引的所有类型中搜索

/gb/_search

在索引gb的所有类型中搜索

/gb,us/_search

在索引gbus的所有类型中搜索

/g*,u*/_search

在以gu开头的索引的所有类型中搜索

/gb/user/_search

在索引gb的类型user中搜索

/gb,us/user,tweet/_search

在索引gbus的类型为usertweet中搜索

/_all/user,tweet/_search

在所有索引的usertweet中搜索 search types user and tweet in all indices

当你搜索包含单一索引时,Elasticsearch转发搜索请求到这个索引的主分片或每个分片的复制分片上,然后聚集每个分片的结果。搜索包含多个索引也是同样的方式——只不过或有更多的分片被关联。

分页

和SQL使用LIMIT关键字返回只有一页的结果一样,Elasticsearch接受fromsize参数:

size: 结果数,默认10

from: 跳过开始的结果数,默认0

如果你想每页显示5个结果,页码从1到3,那请求如下:

GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10

简易搜索

search API有两种表单:一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义,另一种版本使用JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)

查询字符串搜索对于在命令行下运行点对点(ad hoc)查询特别有用。例如这个语句查询所有文档中并在name字段中包含john字符的文档:

GET /_all/_search?q=name:john

_all字段

返回包含"mary"字符的所有文档的简单搜索:

GET /_search?q=mary

当你索引一个文档,Elasticsearch把所有字符串字段值连接起来放在一个大字符串中,它被索引为一个特殊的字段_all。例如,当索引这个文档:

{
    "tweet":    "However did I manage before Elasticsearch?",
    "date":     "2014-09-14",
    "name":     "Mary Jones",
    "user_id":  1
}

这好比我们增加了一个叫做_all的额外字段值:

"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"

若没有指定字段,查询字符串搜索(即q=xxx)使用_all字段搜索。

 
 

原文地址:https://www.cnblogs.com/kakatadage/p/9953850.html

时间: 2024-07-31 00:33:52

Es学习第六课, ES基本搜索_search的相关文章

Es学习第七课, term、terms、match等基本查询语法

term.terms查询 term query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword.numeric.date等明确值的 term:查询某个字段里含有某个关键词的文档 GET /customer/doc/_search/ { "query": { "term": { "title": "blog" } } } terms:查询某个字段里含有多个关键词的文档 GET /custome

python学习第六课 --常用模块

常用模块 sys sys.argv  命令行参数列表,第一个元素是程序本身路径 sys.exit(n)  退出程序,正常退出时exit(0) sys.version sys.maxint  最大的int值 sys.path 返回模块的搜索路径 sys.paltform sys.stdout.wirte("hello") val = sys.stdin.readline()[:-1] logging import logging logging.basicConfig(filename=

python学习第六课 --面向对象

面向对象 class Person(object): --类 def __init__(self,name): --初始化函数 构造方法 self.name = name -- print '---create :',name def say_name(self): --方法 print 'my name is %s' %self.name p1 = Person('gf1')        --实例化 p2 = Person('gf2') p1.say_name()   --person.sa

JAVA学习第六课(面向对象)

面向对象首先要先了解什么是面向对象? 面向对象:就是不断的和对象打交道. 早期解决问题,都是面向过程(简单来说就是一步一步怎么做,面对的是过程,即强调动作),如C语言,利用函数,进行函数的调用. 思想: 面向对象:强调的是对象,对象即指实体.c++,java,c# 例子:把大象装进冰箱 面向过程实现:1.打开冰箱  2.存储大象  3.关上冰箱 面向对象实现:(找到实体,实体封装着这些功能,也就是找到冰箱,冰箱具备打开.存储.关闭功能) 1.冰箱打开  2.冰箱存储   3.冰箱关闭 面向对象的

Web前端学习-第六课JavaScript篇

Q11:什么是执行环境和作用域?使用代码说明. 执行环境定义变量或者函数有权访问的其他数据,决定了他们各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 此函数包含两个对象,他自己的变量对象,全局环境的变量对象,可以在函数内部访问变量color就是因为在这个作用域链中找到它. 延长作用域链::try-catch语句的catch块 With语句 没有块级的作用域: Q12:什么是HTTP?什么是HTTP头部?如何在AJAX中填写HTTP头部? HTT

Web前端学习-第六课HTML篇

Q13:HTML5中Canvas.WebWorkers.Storage三者出现的意义?使用方式(使用代码展示)?优点? Canvas为了客户端矢量图形而设计,自己没有行为,但却把一个绘图API展现给客户端JavaScript以使脚本能够把想绘制的东西都绘制在一块画布上: 使用:大多数canvas绘图API都没有定义在<canvas>元素本身上,而是定义在通过画布的getConText()方法获得的一个绘图环境对象上:canvas也使用了路径的表示法,但是路径有一系列的方法调用来定义,而不是描述

英语学习第六课总结:谐音之传说中的阿姨(re)系列

41.reluctant 不情愿的 reluct/ant(adj后缀,如important) reluct = 阿姨拉客她[不情愿] 42.relic 遗迹 遗址 遗物 relic = 阿姨离开(去世) = 遗物 43.rare 罕见的 rare = 热爱阿姨[很罕见] 44.reduce 减少 reduce = 阿姨丢失 = 减少 45.pure 纯洁的 pure = 朴(素)阿姨 = 纯洁 46.purify 净化 purify = pur(e) + ify(v后缀,如simplify简化)

Struts2学习第六课 实现登录登出功能

关于Struts2请求的扩展名问题: 1).org.apache.struts2包下的default.properties中配置了struts2应用的一些常量 2).struts.action.extension定义了当前struts2应用可以接受的请求的扩展名. 3).可以在struts.xml文件中以常量配置的方式修改default.properties所配置的常量. <constant name="struts.action.extension" value="a

电脑小白学习第六课---打包压缩软件WINRAR

有时为了便于通过网络传输文件,或者为了节省存储空间,我们可以使用压缩软件进行压缩打包操作.压缩软件有很多.比较常用的是winrar.7zip.好压等.我们以winrar为例介绍一下.首先下载安装winrar.下载后,双击安装包,开始安装.直接确定,完成安装.下面对需要压缩打包的文件或文件夹操作.1.压缩打包选中需要处理的文件或文件夹,在选中的上面右击选择"添加到"temp.rar"",这里的temp是上一层目录的文件夹名称.生成压缩文件,如下图所示.如果想对打包压缩