zoukankan      html  css  js  c++  java
  • 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中的索引或类型达到这个目的,像这样:

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

    /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字段搜索。

     
     

     

  • 相关阅读:
    dnn重置Host密码
    fiddle 网址过滤
    生成下面的模块时,启用了优化或没有调试信息
    关闭web.config的继承
    jQuery最佳实践
    坐标高速插入,移动和查询算法
    索引缓存方面的一些测试数据
    转帖微軟将从 .NET 4 以后的版本弃用 System.Data.OracleClient
    算法系列计数排序
    一款免费生成流程图的插件
  • 原文地址:https://www.cnblogs.com/kakatadage/p/9953850.html
Copyright © 2011-2022 走看看