009-elasticsearch【三】示例数据导入、URI查询方式简介、Query DSL简介、查询简述【_source、match、must、should等】、过滤器、聚合

一、简单数据

客户银行账户信息,json

{
    "account_number": 0,
    "balance": 16623,
    "firstname": "Bradshaw",
    "lastname": "Mckenzie",
    "age": 29,
    "gender": "F",
    "address": "244 Columbus Place",
    "employer": "Euron",
    "email": "[email protected]",
    "city": "Hobucken",
    "state": "CO"
}

批量导入1000条

测试数据地址

curl -H "Content-Type: application/json" -XPOST ‘localhost:9200/bank/account/_bulk?pretty&refresh‘ --data-binary "@accounts.json"
curl ‘localhost:9200/_cat/indices?v‘

如果windows上需要把单引号改为双引号

二、URI查询方式简介

  有两种运行搜索的基本方法:一种是通过REST请求URI发送搜索参数,另一种是通过REST请求主体发送搜索参数。

2.1、请求URL方式

GET /bank/_search?q=*&sort=account_number:asc&pretty

说明:q=*  参数指示Elasticsearch匹配索引中的所有文档。

sort = account_number:asc参数指示按升序使用每个文档的account_number字段对结果进行排序。

pretty标识返回漂亮的json格式

{
  took: 31,
  timed_out: false,
  _shards: {
    total: 5,
    successful: 5,
    failed: 0
  },
  hits: {
    total: 1000,
    max_score: null,
    hits: [
      {
        _index: "bank",
        _type: "account",
        _id: "0",
        _score: null,
        _source: {
          account_number: 0,
          balance: 16623,
          firstname: "Bradshaw",
          lastname: "Mckenzie",
          age: 29,
          gender: "F",
          address: "244 Columbus Place",
          employer: "Euron",
          email: "[email protected]",
          city: "Hobucken",
          state: "CO"
        },
      sort: [0]    }
    //……
    ]
  }
}

响应值说明

took:Elasticsearch执行搜索的时间(以毫秒为单位)

time_out:搜索是否超时

_shards:搜索了多少片,以及搜索片成功/失败的次数

hits:搜索结果

hits.total:符合我们搜索条件的文件总数
hits.hits:实际的搜索结果数组(默认为前10个文档)
hits.sort:对结果进行排序键(按分数排序时丢失)
hits._score and max_score:暂时忽略

2.2、请求体方式

使用工具header时候 使用post请求

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

三、Query DSL简介

  Elasticsearch提供了一种可用于执行查询的JSON式特定于领域的语言。这被称为Query DSL。

注意使用header 工具时应该使用post请求

3.1、查询所有

GET /bank/_search
{
  "query": { "match_all": {} }
}

  match_all部分仅仅是我们想要运行的查询类型。 match_all查询只是搜索指定索引中的所有文档。

3.2、查询数据

GET /bank/_search
{
  "query": { "match_all": {} },
  "size": 1
}

请注意,如果未指定大小,则默认为10。

3.3、返回分页  

此示例执行match_all并返回文档11至20:

GET /bank/_search
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}

from参数(从0开始)指定从哪个文档索引开始,size参数指定从from参数开始返回多少个文档。此功能在实现分页搜索结果时非常有用。请注意,如果from未指定,则默认为0。

3.4、降序

此示例执行match_all并按帐户余额按降序对结果进行排序,并返回前10个(默认大小)文档。

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }
}

四、查询简述

4.1、返回指定字段

  请求是增加_source字段,在概念上与SQL SELECT 字段1 FROM字段列表有些相似。

  返回的文档字段。默认情况下,完整的JSON文档作为所有搜索的一部分返回。这被称为源(搜索匹配中的_source字段)。如果我们不希望整个源文档被返回,我们有能力只需要返回源内的几个字段。

GET /bank/_search
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}

4.2、匹配查询

全匹配  

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

匹配查询,它可以被认为是基本的搜索查询(即针对特定字段或字段集合进行的搜索)。

//匹配account_number=20的数据GET /bank/_search
{
  "query": { "match": { "account_number": 20 } }
}
//匹配 address = mill
GET /bank/_search
{
  "query": { "match": { "address": "mill" } }
}
//匹配 address =mill 或 lane
GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}
//匹配 address =“mill lane” 全部的
GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

4,3、bool(布尔)查询

4.3.1、must == and

//匹配address=mill 并且 address =lane的文档 等价于 "query": { "match_phrase": { "address": "mill lane" } }
 GET /bank/_search { "query": { "bool": { "must": [ { "match": { "address": "mill" } }, { "match": { "address": "lane" } } ] } } }

bool must子句指定了一个文档被认为是匹配的所有查询。

4.3.2、should==or

//匹配address=mill或者address=lane 等价于 "query": { "match": { "address": "mill lane" } }
GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

bool should子句指定了一个查询列表,其中任何一个查询都必须是真的才能被认为是匹配的文档。

4.3.3、must_not==not

//地址address!=mill 也 address!=lane
GET /bank/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

bool must_not子句指定了一个查询列表,其中任何一个查询都不应该被认为是匹配的文档。

4.3.4、组合使用

可以在一个bool查询中同时结合must,should和must_not子句。此外,我们可以在任何这些bool子句中编写布尔查询来模拟任何复杂的多级布尔逻辑。

//返回任何40岁但未居住在ID街道人的所有帐户
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

五、过滤器简述

  文档分数(搜索结果中的_score字段)的细节。分数是一个数值,它是文档与我们指定的搜索查询匹配度的相对度量。分数越高,文档越相关,分数越低,文档的相关性越低。

  但查询并不总是需要生成分数,特别是当它们仅用于“过滤”文档集时。 Elasticsearch检测这些情况并自动优化查询执行,以便不计算无用分数。

  bool查询还支持筛选子句,它允许使用查询来限制将由其他子句匹配的文档,而不会更改计算分数的方式。范围查询,它允许我们通过一系列值来过滤文档。这通常用于数字或日期过滤。

5.1、rang 过滤

//查找余额大于或等于20000且小于等于30000的帐户。
GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

解析,bool查询包含一个match_all查询(查询部分)和一个范围查询(过滤器部分)。我们可以将任何其他查询替换为查询和过滤器部分。范围查询非常有意义,因为落入该范围的文档全部匹配“平等”,即没有文档比另一个更重要。

六、聚合

  聚合提供了从数据中分组和提取统计数据的功能。考虑聚合的最简单方法是将其大致等同于SQL GROUP BY和SQL聚合函数。在Elasticsearch中,您可以执行返回匹配的搜索,同时还可以在一个响应中返回与匹配不同的聚合结果。这是非常强大和高效的,因为您可以运行查询和多个聚合,并使用简洁和简化的API避免网络往返,从而一次性获得两种(或两种)操作的结果。

6.1、group by、count

//使用state街道对所有帐户进行分组,然后返回按降序(也是默认值)排序的前10个(默认)状态:
GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

相当于数据库

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

响应结果

{
"took": 49,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1000,
"max_score": 0,
"hits": [ ]
},
"aggregations": {
"group_by_state": {
"doc_count_error_upper_bound": 20,
"sum_other_doc_count": 770,
"buckets": [
{
"key": "ID",
"doc_count": 27
}
,
{
"key": "TX",
"doc_count": 27
}
,
{
"key": "AL",
"doc_count": 25
}
,
{
"key": "MD",
"doc_count": 25
}
,
{
"key": "TN",
"doc_count": 23
}
,
{
"key": "MA",
"doc_count": 21
}
,
{
"key": "NC",
"doc_count": 21
}
,
{
"key": "ND",
"doc_count": 21
}
,
{
"key": "ME",
"doc_count": 20
}
,
{
"key": "MO",
"doc_count": 20
}
]
}
}
}

注意,我们将size = 0设置为不显示搜索匹配,因为我们只想查看响应中的聚合结果。

6.2、group by 、count,avg

//按state州 计算平均账户余额(再次仅针对按计数降序排列的前10个州):
GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

注意,如何在group_by_state聚合内嵌套average_balance聚合。这是所有聚合的通用模式。可以任意嵌套聚合内的聚合,以便从数据中提取所需的旋转摘要。

按降序对平均余额进行排序:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

如何按年龄段(20-29岁,30-39岁和40-49岁)进行分组,然后按性别进行分组,然后最终得出每个性别的年龄段平均账户余额:

GET /bank/_search
{
  "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.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

更多聚合:https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-aggregations.html

原文地址:https://www.cnblogs.com/bjlhx/p/8508186.html

时间: 2024-10-09 00:08:45

009-elasticsearch【三】示例数据导入、URI查询方式简介、Query DSL简介、查询简述【_source、match、must、should等】、过滤器、聚合的相关文章

Elasticsearch学习笔记(二)Search API 与 Query DSL

一. Search API eg: GET /mall/product/_search?q=name:productName&sort=price desc 特点:search的请求参数都是以HTTP请求的的query stirng 附带的 适用范围:适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息: 适用于简单的查询条件 二.Query DSL 将Query DSL视为ASL查询则有两种类型的查询语句: 叶子查询语句(Leaf Query clause) : 叶

MongoDB学习(三)数据导入导出及备份恢复

这几天想着公司要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下命令均在cmd命令行中输入,导出及备份未指明目录情况下,均保存在当前操作目录下. 数据导出mongoexport 1.常用导出方法:导出数据为json 假设库里有一张area 表,里面有9 条记录,我们要将它导出 >c:\mongo\bin\mongoexport -d iflashbuy_log

Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.其它的,包括一些查询函数(count(),sum()等).查询条件的设定等,全都跟SQL语法一样. 示例: Session session = SessionFactory.getCurrentSession(); User user = null; Transaction ts = s

infobright系列三:数据导入乱码

1:目前在用的是社区版的infobright,不支持DML功能,只能用LOAD DATA方式导入数据. 如果元数据中有特殊控制字符,导入过程中经常会报错 2: 设置Reject File导入之前,设定 @BH_REJECT_FILE_PATH 和 @BH_ABORT_ON_COUNT 就可以忽略多少条导入失败的记录,并且将这些记录保存在指定文件/** when the number of rows rejected reaches 10, abort process **/ set @BH_RE

9.Solr4.10.3数据导入(post.jar方式和curl方式)

转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.使用post.jar方式 java -Durl=http://192.168.137.168:8080/solr/mycore/update -Ddata=files -jar /usr/local/solr-4.10.3/example/exampledocs/post.jar /usr/local/solr-4.10.3/example/multicore/exampledocs/ipod_othe

016-elasticsearch【五】-Query DSL【1】-查询上下文,过滤上下文、match_all

一.概述 Elasticsearch提供基于JSON的完整查询DSL来定义查询.将Query DSL视为查询的AST,由两种类型的子句组成: 叶子查询子句 叶子查询子句在特定字段中查找特定值,例如匹配,词条或范围查询.这些查询可以自己使用. 复合查询子句 复合查询子句包装其他叶或复合查询,并用于以逻辑方式(例如bool或dis_max查询)组合多个查询,或者改变它们的行为(如constant_score查询). 查询子句的行为有所不同,具体取决于它们是在查询上下文还是过滤器上下文中使用. 二.查

hibernate的三种查询方式

hibernate的查询方式常见的主要分为三种: HQL, QBC, 以及使用原生SQL查询(Session的查询) 1)Query的查询:使用HQL语句或SQL语句完成查询 2)Criteria的查询:通过方法和类中属性的关系,来设置查询条件,完成查询. 3)Session的查询:按主键查询查询,方法为get或load 一.HQL查询 ? HQL(Hibernate Query Language)提供了丰富灵活的查询方式,使用HQL进行查询也是Hibernate官方推荐使用的查询方式. ? H

基于spark的关系型数据库到HDFS的数据导入

package com.shenyuchong; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession; import java.net.HttpURLCon

[Elasticsearch] 控制相关度 (二) - Lucene中的PSF(Practical Scoring Function)与查询期间提升

本章翻译自Elasticsearch官方指南的Controlling Relevance一章. Lucene中的Practical Scoring Function 对于多词条查询(Multiterm Queries),Lucene使用的是布尔模型(Boolean Model),TF/IDF以及向量空间模型(Vector Space Model)来将它们结合在一起,用来收集匹配的文档和对它们进行分值计算. 像下面这样的多词条查询: GET /my_index/doc/_search { "que