ElasticSearch进阶检索

入门检索中讲了如何导入elastic提供的样本测试数据,下面我们用这些数据进一步检索

一、SearchAPI

ES 支持两种基本方式检索 :

1、一种是通过使用 REST request URI 发送搜索参数(uri+检索参数)

​ GET bank/_search 检索 bank 下所有信息,包括 type 和 docs

​ GET bank/_search?q=*&sort=account_number:asc 请求参数方式检索

2、另一种是通过使用 REST request body 来发送它们(uri+请求体)

GET /bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"account_number": "asc"
}
]
}
# query 查询条件
# sort 排序条件

响应结果

响应结果解释:

took - 执行搜索的时间(毫秒)

time_out - 告诉我们搜索是否超时

_shards - 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片

hits - 搜索结果

hits.total - 搜索结果条数

hits.hits - 实际的搜索结果数组(默认为前 10 的文档)

sort - 结果的排序 key(键)(没有则按 score 排序)

score 和 max_score –相关性得分和最高得分(全文检索用)

二、Query DSL

1、基本语法格式

Elasticsearch 提供了一个可以执行查询的 Json 风格的 DSLdomain-specific language 领域特

定语言)。这个被称为 Query DSL。

一个查询语句的典型结构:

QUERY_NAME:{
ARGUMENT:VALUE,
ARGUMENT:VALUE,...
}

如果针对于某个字段,那么它的结构如下:

{
QUERY_NAME:{
FIELD_NAME:{
ARGUMENT:VALUE,
ARGUMENT:VALUE,...
}
}
}

请求示例

GET bank/_search
{
"query": {
"match_all": {}
},
"from":0,
"size":5,
"sort": [
{
"balance": {
"order": "desc"
}
}
]
}
#query 定义如何查询
#match_all 查询类型【代表查询所有的所有】,es 中可以在 query 中组合非常多的查询类型完成复杂查询
#除了 query 参数之外,我们也可以传递其它的参数以改变查询结果。如 sort,size from+size 限定完成分页
#sort 排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准

2、返回部分字段

_source:需要返回哪些字段写在数组中即可

3、match【匹配查询】

(1)对于基本数据类型的(非字符串),进行精确匹配

GET bank/_search
{
"query": {
"match": {
"account_number": 10
}
}
}
#match 返回 account_number=10 的

(2)对于字符串类型的字段,进行全文检索,模糊匹配

GET bank/_search
{
"query": {
"match": {
"address": "mill"
}
}
}
#最终查询出 address 中包含 mill 单词的所有记录
#match 当搜索字符串类型的时候,会进行全文检索,并且每条记录有相关性得分

(3)字符串,多个单词(分词+全文检索)

GET bank/_search
{
"query": {
"match": {
"address": "mill road"
}
}
}
#最终查询出 address 中包含 mill 或者 road 或者 mill road 的所有记录,并给出相关性得分(_score),也会按照这个评分排序

(4)精确匹配文本字符串

GET bank/_search
{
"query": {
"match": {
"address.keyword": " Mill road"
}
}
}
# 查找 address完全为Mill Street 的数据

4、match_phrase【短语匹配】

将需要匹配的值当成一个整体单词(不分词)进行检索

GET bank/_search
{
"query": {
"match_phrase": {
"address": "mill road"
}
}
}
#查出 address 中包含 mill road 的所有记录,并给出相关性得分

5、multi_match【多字段匹配】

GET bank/_search
{
"query": {
"multi_match": {
"query": "mill",
"fields": [
"city","address"
]
}
}
}
#检索 city 或 address 匹配包含 mill 的数据,会对查询条件分词

6、bool【复合查询】

bool 用来做复合查询: 复合语句可以合并任何其它查询语句,包括复合语句,复合语句之间可以互相嵌套,可以表达非常复杂的逻辑

(1)must:必须达到must所列举的所有条件

GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {"firstname": "Forbes"}},
{"match": {"gender": "M"}}
]
}
}
}

(2)must_not 必须不是指定的情况

GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {"firstname": "Forbes"}},
{"match": {"gender": "M"}}
],
"must_not": [
{"match": {"lastname": "Wallace"}}
]
}
}
}

(3)should:应该达到 should列举的条件

如果达到会增加相关文档的评分并不会改变 查询的结果。如果 query 中只有 should 且只有一种匹配规则,那么 should 的条件就会被作为默认匹配条件而去改变查询结果

GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {"address": "mill"}},
{"match": { "gender": "M" }}
],
"should": [ {"match": { "address": "lane" }} ]
}
}
}
#应该匹配,匹配到能增加文档相关性得分,匹配不到也不会影响查询结果

7、filter【结果过滤】

不是所有的查询都需要计算相关性得分,仅用于 “filtering”(过滤)的文档。为了不计算分数 Elasticsearch 会自动检查场景并且优化查询的执行。

GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {"address": "mill"}}
],
"filter": [
{"range": {
"balance": {
"gte": 10000,
"lte": 20000
}
}}
]
}
}
}
#range范围查询,大于1000小于20000

8、term精确检索

避免使用 term 查询文本字段,默认情况下,Elasticsearch 会通过analysis分词将文本字段的值拆分为一部分,这使精确匹配文本字段的值变得困难。如果要查询文本字段值,请使用 match 查询代替。

和 match 一样,匹配某个属性的值。全文检索字段用 match其他非 text 字段匹配用 term

GET bank/_search
{
"query": {
"term": {
"age": "20"
}
}
}

9、Aggregation-执行聚合

聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于 SQL GROUP BY 和 SQL聚合函数。

详细的介绍可以查看官网关于Aggregation的文档,下面提供几个示例来看一下聚合

https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-aggregations.html

(1)搜索address中包含 mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情

GET bank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"group_by_state": {
"terms": {
"field": "age"
}
},
"avg_age":{
"avg": {
"field": "age"
}
}
},
"size": 0
}
#size:0 不显示搜索数据
#aggs:执行聚合。聚合语法如下:
#"aggs": {
"aggs_name 这次聚合的名字,方便展示在结果集中": {
"AGG_TYPE 聚合的类型(avg,term,terms)": {
"field": "age"
}
}
}

(2)按照年龄聚合,并且请求这些年龄段的这些人的平均薪资

GET bank/_search
{
"query": {"match_all": {}},
"aggs": {
"group_by_state": {
"terms": {
"field": "age"
},
"aggs": {
"avg_age": {
"avg": {
"field": "age" }
}
}
}
}
}
#其实就是aggs里面又加了一个aggs,第二个aggs根据第一个aggs聚合后的结果在聚合

(3)查出所有年龄分布,并且这些年龄段中 性别为M 的平均薪资和 性别为F 的平均薪资以及这个年龄

段的总体平均薪资

GET bank/_search
{
"query": {"match_all": {}},
"aggs": {
"age_avg":{
"terms": {
"field": "age",
"size": 1000
},
"aggs": {
"gender_avg": {
"terms": {
"field": "gender.keyword",
"size": 10
},
"aggs": {
"balance_avg": {
"avg": {
"field": "balance"
}
}
}
},
"balance_avg": {
"avg": {
"field": "balance"
}
}
}
}
}
}

ElasticSearch进阶检索的更多相关文章

  1. ElasticSearch 进阶

    目录 ElasticSearch 进阶 SearchAPI 检索信息 Query DSL 基本语法格式 查询-match 查询-match_phrase 查询-multi_match 查询-bool复 ...

  2. ElasticSearch入门检索

    前面简介说到 elsatic是通过RestFul API接口操作数据的,可以通过postman模拟接口请求测试一下 一._cat 1.GET /_cat/nodes:查看所有节点 2.GET /_ca ...

  3. Elasticsearch原理学习--为什么Elasticsearch/Lucene检索可以比MySQL快?

    转载于:http://vlambda.com/wz_wvS2uI5VRn.html 同样都可以对数据构建索引并通过索引查询数据,为什么Lucene或基于Lucene的Elasticsearch会比关系 ...

  4. 分布式搜索elasticsearch 文献检索索引 入门

    1.首先,例如,下面的数据被提交给ES该指数 {"number":32768,"singer":"杨坤","size": ...

  5. 搭建ElasticSearch+MongoDB检索系统

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  6. ES 19 - Elasticsearch的检索语法(_search API的使用)

    目录 1 Search API的基本用法 1.1 查询所有数据 1.2 响应信息说明 1.3 timeout超时机制 1.4 查询多索引和多类型中的数据 2 URI Search的用法 2.1 GET ...

  7. Elasticsearch高级检索之使用单个字母数字进行分词N-gram tokenizer(不区分大小写)【实战篇】

    一.前言 小编最近在做到一个检索相关的需求,要求按照一个字段的每个字母或者数字进行检索,如果是不设置分词规则的话,英文是按照单词来进行分词的. 小编以7.6.0版本做的功能哈,大家可以根据自己的版本去 ...

  8. elasticsearch 拼音检索能力研究

    gitchennan/elasticsearch-analysis-lc-pinyin 配置参数少,功能满足需求. 对应版本 elasticsearch2.3.2 对应 elasticsearch-a ...

  9. ElasticSearch 分页检索

    在ElasticSearch的多索引和多类别里说到我们在集群中有14个文档匹配我们的(空)搜索语句.单数仅仅有10个文档在hits数组中.我们怎样看到其它文档? 和SQL使用LIMITkeyword返 ...

随机推荐

  1. Excel选择区域一次性替换小于200的数值

    1.ctrl+F,点击"选项",在出来的扩展框选择"格式"后小三角,选择"从单元格选择格式": 2.选择要进行替换小于200的区域: . 3 ...

  2. redis字典快速映射+hash釜底抽薪+渐进式rehash | redis为什么那么快

    前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...

  3. 使用 CKEditor编辑插件

    1, 安装方法 下载CKEditor插件,然后解压到对应的文件中.建议解压到JS文件夹下面的CKEditor这个文件夹下.下载地址 : http://down.chinaz.com/soft/2516 ...

  4. layui--入门(helloWorld)

    具体可参考官方文档:https://www.layui.com/doc/ 由于引入layui 需要用到node.js 安装过程可参考: https://www.cnblogs.com/liuchenx ...

  5. AvtiveMQ与SpringBoot结合

    首先来了解下ActivieMQ的应用场景,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构是大型分布式系统不可缺少的中间件 ...

  6. ansible 任务执行

    ansible 任务执行模式 Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook: ad-hoc模式(点对点模式)• ad-hoc模式(点对点模式) 使用单个 ...

  7. Java:Java的<<<移位运算符详解

    1) 左移运算(<<)       左移就是把所有位向左移动几位 如:   12 << 2    意思就是12向左移动两位 12的二进制是: 0000 1100 通过这个图我们 ...

  8. JNI小记

    本文参考<较详细的介绍JNI>一文,并添加了一些方法,代码已经过测试,留待日后工作使用.关于JNI的HelloWorld的例子,就不赘述了. java代码: 1 package com.c ...

  9. [刘阳Java]_纯CSS代码实现内容过滤效果

    继续我们技术专题课,我们今天给大家带来的是一个比较酷炫的"纯CSS代码实现内容过滤效果",没有加入任何JS的效果.全部都是应用CSS3的新增选择器来实现的.先看效果截图 实现思路 ...

  10. 【LeetCode】217.存在重复元素

    217. 存在重复元素 知识点:数组:Set: 题目描述 给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 fals ...