`
weitao1026
  • 浏览: 1062107 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

es的返回数据结构

 
阅读更多

ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API。本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用。虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的特性。

其他相关的内容参考:Elasticsearch官方文档翻译

样例数据

为了更好的使用和理解ES,没有点样例数据还是不好模拟的。这里提供了一份官网上的数据,accounts.json。如果需要的话,也可以去这个网址玩玩,它可以帮助你自定义写随机的JSON数据

首先开启你的ES,然后执行下面的命令,windows下需要自己安装curl、也可以使用cygwin模拟curl命令:

curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary  @accounts.json

注意:

1 需要在accounts.json所在的目录运行curl命令。

2 localhost:9200是ES得访问地址和端口

3 bank是索引的名称

4 account是类型的名称

5 索引和类型的名称在文件中如果有定义,可以省略;如果没有则必须要指定

6 _bulk是rest得命令,可以批量执行多个操作(操作是在json文件中定义的,原理可以参考之前的翻译)

7 pretty是将返回的信息以可读的JSON形式返回。

执行完上述的命令后,可以通过下面的命令查询:

curl 'localhost:9200/_cat/indices?v'
health index pri rep docs.count docs.deleted store.size pri.store.size
yellow bank    5   1       1000            0    424.4kb        424.4kb

搜索API

ES提供了两种搜索的方式:请求参数方式请求体方式

请求参数方式

curl 'localhost:9200/bank/_search?q=*&pretty'

其中bank是查询的索引名称,q后面跟着搜索的条件:q=*表示查询所有的内容

请求体方式(推荐这种方式)

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} }
}'

这种方式会把查询的内容放入body中,会造成一定的开销,但是易于理解。在平时的练习中,推荐这种方式。

 

返回的内容

复制代码
{
  "took" : 26,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "1",
      "_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
    }, {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "6",
      "_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
    }, {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "13",
复制代码

返回的内容大致可以如下讲解:

took:是查询花费的时间,毫秒单位

time_out:标识查询是否超时

_shards:描述了查询分片的信息,查询了多少个分片、成功的分片数量、失败的分片数量等

hits:搜索的结果,total是全部的满足的文档数目,hits是返回的实际数目(默认是10)

_score是文档的分数信息,与排名相关度有关,参考各大搜索引擎的搜索结果,就容易理解。 

由于ES是一次性返回所有的数据,因此理解返回的内容是很必要的。它不像传统的SQL是先返回数据的一个子集,再通过数据库端的游标不断的返回数据(由于对传统的数据库理解的不深,这里有错还望指正)。

查询语言DSL

ES支持一种JSON格式的查询,叫做DSL,domain specific language。这门语言刚开始比较难理解,因此通过几个简单的例子开始:

下面的命令,可以搜索全部的文档:

{
  "query": { "match_all": {} }
}

query定义了查询,match_all声明了查询的类型。还有其他的参数可以控制返回的结果:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} },
  "size": 1
}'

上面的命令返回了所有文档数据中的第一条文档。如果size不指定,那么默认返回10条。

 

下面的命令请求了第10-20的文档。

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}'
复制代码

 

下面的命令指定了文档返回的排序方式:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }
}'

 

执行搜索

上面了解了基本的搜索语句,下面就开始深入一些常用的DSL了。

之前的返回数据都是返回文档的所有内容,这种对于网络的开销肯定是有影响的,下面的例子就指定了返回特定的字段:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}'

再回到query,之前的查询都是查询所有的文档,并不能称之为搜索引擎。下面就通过match方式查询特定字段的特定内容,比如查询余额为20的账户信息:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "account_number": 20 } }
}'

查询地址为mill的信息:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "address": "mill" } }
}'

查询地址为mill或者lane的信息:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "address": "mill lane" } }
}'

如果我们想要返回同时包含mill和lane的,可以通过match_phrase查询:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_phrase": { "address": "mill lane" } }
}'

ES提供了bool查询,可以把很多小的查询组成一个更为复杂的查询,比如查询同时包含mill和lane的文档:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'
复制代码

修改bool参数,可以改为查询包含mill或者lane的文档:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'
复制代码

也可以改写为must_not,排除包含mill和lane的文档:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'
复制代码

bool查询可以同时使用must, should, must_not组成一个复杂的查询:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}'
复制代码

过滤查询

之前说过score字段指定了文档的分数,使用查询会计算文档的分数,最后通过分数确定哪些文档更相关,返回哪些文档。

有的时候我们可能对分数不感兴趣,就可以使用filter进行过滤,它不会去计算分值,因此效率也就更高一些。

filter过滤可以嵌套在bool查询内部使用,比如想要查询在2000-3000范围内的所有文档,可以执行下面的命令:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}'
复制代码

ES除了上面介绍过的范围查询range、match_all、match、bool、filter还有很多其他的查询方式,这里就先不一一说明了。

聚合

聚合提供了用户进行分组和数理统计的能力,可以把聚合理解成SQL中的GROUP BY和分组函数。在ES中,你可以在一次搜索查询的时间内,即完成搜索操作也完成聚合操作,这样就降低了多次使用REST API造成的网络开销。

下面就是通过terms聚合的简单样例:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      }
    }
  }
}'
复制代码

它类似于SQL中的下面的语句:

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

返回的数据:

复制代码
"hits" : {
    "total" : 1000,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "buckets" : [ {
        "key" : "al",
        "doc_count" : 21
      }, {
        "key" : "tx",
        "doc_count" : 17
      }, {
        "key" : "id",
        "doc_count" : 15
      }, {
        "key" : "ma",
        "doc_count" : 15
      }, {
        "key" : "md",
        "doc_count" : 15
      }, {
        "key" : "pa",
        "doc_count" : 15
      }, {
        "key" : "dc",
        "doc_count" : 14
      }, {
        "key" : "me",
        "doc_count" : 14
      }, {
        "key" : "mo",
        "doc_count" : 14
      }, {
        "key" : "nd",
        "doc_count" : 14
      } ]
    }
  }
}
复制代码

由于size设置为0,它并没有返回文档的信息,只是返回了聚合的结果。

比如统计不同账户状态下的平均余额:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}'
复制代码

聚合支持嵌套,举个例子,先按范围分组,在统计不同性别的账户余额:

复制代码
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}'
复制代码

聚合可以实现很多复杂的功能,而且ES也提供了很多复杂的聚合,这里作为引导篇,也不过多介绍了。

 

对于基本的数据搜索大致就是上面讲述的样子,熟悉了一些常用的API,入门还是很简单的,倒是要熟练使用ES,还是需要掌握各种搜索查询的命令,以及ES内部的原理。

分享到:
评论

相关推荐

    Elasticsearch使用工具类

    返回全部命中数据可能涉及到分页处理,因为Elasticsearch不鼓励一次性获取大量数据。`ElasticsearchUtil`可以提供一个`getAllHits(String index, String type, int from, int size)`方法,通过from和size参数实现...

    Elasticsearch测试数据.rar

    在测试数据中,我们可能会看到每条记录都是一个JSON对象,这是Elasticsearch处理数据的基本单位,因为JSON格式便于存储和检索结构化信息。例如,每条记录可能包括“用户ID”、“用户名”、“年龄”、“购买历史”等...

    ES客户端+谷歌浏览器插件+Multi-Elasticsearch-Head

    多弹性搜索头,对著名的 Elasticsearch Head 的改进 1.保存和存储几个Elasticsearch端点 ...它通常提供了一种直观的方式来查看索引结构、执行查询语句、分析日志数据,以及执行其他与Elasticsearch管理相关的任务。

    项目实战——Spark将Hive表的数据写入ElasticSearch(Java版本)

    在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...

    elasticsearch7.17.14版本分词器插件安装包

    在日志收集和分析领域,Elasticsearch(简称ES)是广泛应用的搜索引擎和数据分析工具,它与Logstash(数据采集)、Kibana(数据可视化)共同构成了ELK(Elasticsearch、Logstash、Kibana)栈。对于中文处理,分词器...

    Go-go-elasticsearch:Elasticsearch官方的go语言客户端

    - **错误处理**:对Elasticsearch返回的HTTP状态码和错误信息进行了封装,方便开发者处理异常情况。 - **连接池管理**:支持连接池,能有效管理与Elasticsearch节点的连接,提高性能和可靠性。 - **请求构建器**:...

    ElasticSearch实战教程

    非结构化数据搜索使用倒排索引,例如ElasticSearch。 在搜索实战中,我们将学习如何使用ElasticSearch实现搜索引擎,如何使用ElasticSearch实现数据分析等。同时,我们还将学习ElasticSearch的配置、管理和优化等。...

    Elasticsearch入门学习笔记

    Elasticsearch的核心数据结构是倒排索引,它极大地提高了搜索效率。倒排索引由词典和倒排列表两部分组成。词典存储所有唯一单词,每个单词对应一个词项编号;倒排列表记录每个单词出现在哪些文档中,以及在文档内的...

    最新版windows elasticsearch-8.5.2-windows-x86-64.zip

    4. **数据结构丰富**:除了支持文本搜索,Elasticsearch还支持数值、地理位置、日期等不同数据类型的索引,方便处理复杂的数据类型。 5. **分析器与分词**:Elasticsearch内置了多种语言的分析器,可以对输入的文本...

    elasticsearch-7.10.2-darwin-x86_64.tar.gz MAC版本免费下载

    4. 数据结构化搜索:支持JSON文档存储,可以对复杂的数据结构进行搜索,如嵌套字段和数组。 5. 自动发现和动态集群:新节点加入集群时,Elasticsearch能自动识别并分配工作负载,无需人工干预。 6. 高级查询:支持...

    基于Elasticsearch Java API的参考手册

    Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于大数据领域的实时分析和信息检索。Java API是Elasticsearch官方提供的与Elasticsearch服务器进行交互的主要工具,它使得开发者能够用Java...

    elasticsearch-sql插件(es2.2.0版本)

    Elasticsearch-SQL插件是针对Elasticsearch(一个流行的全文搜索引擎)设计的一款扩展工具,它使得用户能够通过SQL(结构化查询语言)来查询、操作Elasticsearch中的数据。这个插件极大地简化了对Elasticsearch的...

    01 - Elasticsearch 简单而高效的管道查询语言- ES QL 杭州 1.6 2024

    Elasticsearch 查询语言(ES|QL)是 Elasticsearch 为用户提供的一种强大而直观的查询工具,它结合了管道(pipe)概念,允许用户对存储在 Elasticsearch 中的数据进行过滤、转换和分析。这个新的查询语言设计目标是...

    Elasticsearch 7基于springboot的应用

    **Elasticsearch 7 ...提供的 `elasticsearch.pdf` 文件可能包含了更深入的理论介绍和最佳实践,而 `maguo-es-jd` 和 `maguo-es-api` 文件可能包含具体的代码示例和 API 使用说明,对于初学者来说是很好的学习资源。

    elasticsearch-6.2.4.tar.gz.zip

    5. **多模态数据分析**:除了文本,Elasticsearch 还支持数值、日期、地理位置等多种类型的数据,可以用于结构化和半结构化数据的存储和分析。 6. **聚合分析**:Elasticsearch 提供丰富的聚合功能,允许用户对数据...

    curl.rar ElasticSearch 批量导入一批数据

    数据应与ElasticSearch索引的映射结构相匹配,确保字段类型一致。 2. **创建索引**:在导入数据前,你需要在ElasticSearch中创建一个索引,指定索引的名称、映射(mapping)和其他设置。映射定义了字段的数据类型,...

    Elasticsearch5.2可视化插件 elasticsearch-head-master

    4. **映射管理**:查看和编辑索引的字段映射,有助于理解数据结构和索引设置。 5. **搜索与查询**:提供 Lucene 查询语法,可以进行复杂搜索操作,返回结果可排序、分页。 6. **节点监控**:显示各节点的内存、...

    Go-elasticsearchloggolang的elasticsearch日志封装包括搜索查询添加等

    通过这个库,开发者可以方便地将应用程序的日志数据结构化地存储到Elasticsearch中。这通常涉及创建Elasticsearch的索引、类型,并将日志条目作为文档进行添加。库中的API可能会提供一个方法,例如`AddDocument`,...

    elasticsearch-2.4.4.zip

    Elasticsearch 是一种分布式、实时的搜索和分析引擎,它可以处理大量数据并快速返回结果。其核心特性包括: 1. 分布式:Elasticsearch 支持多节点集群,可以自动进行数据分片和复制,确保高可用性和容错性。在 ...

    Elasticsearch学习文档.doc

    Elasticsearch 的实现原理主要分为以下几个步骤:首先用户将数据提交到 Elastic Search 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名...

Global site tag (gtag.js) - Google Analytics