03_ES数据查询操作

简介: 03_ES数据查询操作

1、数据准备

post /lib3/user
{
  "name":"lisi",
  "address":"shandong",
  "age":18,
  "interests":"youyong shufa changge tiaowu",
  "birthday":"2001-01-19"
}
post /lib3/user
{
  "name":"wangwu",
  "address":"zhejiang",
  "age":22,
  "interests":"youyong shufa",
  "birthday":"1997-01-19"
}
post /lib3/user
{
  "name":"zhangsan",
  "address":"zhejiang",
  "age":20,
  "interests":"youyong shufa changge changpao",
  "birthday":"1999-08-29"
}
post /lib3/user
{
  "name":"youyong",
  "address":"zhejiang",
  "age":20,
  "interests":"youyong shufa changge changpao",
  "birthday":"1999-08-29"
}

测试一下

get /lib3/user/_search?q=name:lisi
get /lib3/user/_search?q=name:wangwu&sort=age:desc

2、term查询和terms查询

精准查询term

term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date。

term:查询某个字段里含有某个关键词的文档

terms:查询某个字段里含有多个关键词的文档

a、term 和 terms 是 包含(contains) 操作,而非 等值(equals) (判断)

b、不知道分词器的存在,所以不会去分词,

c、所谓的包含是文档分词结果某个分词是否相等,即文档是否包含这个分词

d、因为是在分词结果中匹配,所以大写要转换为小写,大写字母是匹配不到

get /lib3/user/_search/
{
  "query":{"term":{ "interests":"youyong"}}
}
get lib3/user/_search/
{
  "query":{"terms":{"interests":["shufa","youyong"]}}
}

3、控制查询返回的数量

get lib3/user/_search
{
  "from":0,
  "size":2,
  "query":{
    "terms":{
      "interests": ["changge","tiaowu"]
    }
  }
}

4、返回版本号

get lib3/user/_search
{
  "version":true,
  "query":{
    "term":{"interests": "changge"}
  }
}

5、match查询

match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程,match查询相当于模糊匹配,只包含其中一部分关键词就行
同时还要注意match系列匹配时,datatype要设置为text,否则不会开启分词

match query知道分词器的存在,会对filed进行分词操作,然后再查询
match_all:查询所有文档
multi_match:可以指定多个字段
match_phrase:短语匹配查询,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变

GET lib3/user/_search
{
  "query":{"match":{"age": 20}}
}
GET lib3/user/_search
{
  "query":{"match":{"interests": "changge"}}
}
GET lib3/user/_search
{
  "query":{
    "match_all": {}
  }
}
GET lib3/user/_search
{
  "query":{
    "multi_match": {
      "query": "youyong",
      "fields":["interests","name"]
    }
  }
}
get lib3/user/_search
{
  "query":{
    "match_phrase":{"interests": "youyong shufa"}
  }
}

6、指定返回的字段

get lib3/user/_search
{
  "_source":["name","age"],
  "query":{
    "match": {
      "interests": "changge"
    }
  }
}

7、显示要的字段、去除不需要的字段、可以使用通配符*

get lib3/user/_search
{
  "query":{
    "match_all": {}
  },
  "_source":{
     "includes": "addr*",
     "excludes": ["name","bir*"]
  }
}

8、排序

前缀匹配查询"match_phrase_prefix", 并使用sort实现排序:desc:降序,asc升序

GET /lib3/user/_search
{
    "query": {
        "match_phrase_prefix": {
          "interests": "you"
        }
    },
    "sort":[
      {
        "age":{"order": "desc"}
      }
    ]
}


9、 范围查询

range:实现范围查询

参数:from,to,include_lower,include_upper,boost

include_lower:是否包含范围的左边界,默认是true

include_upper:是否包含范围的右边界,默认是true

GET /lib3/user/_search
{
    "query": {
        "range": {
            "birthday": {
                "from": "1990-10-10",
                "to": "2000-05-01",
                 "include_lower": true,
                "include_upper": false
            }
        }
    }
}
GET /lib3/user/_search
{
    "query": {
        "range": {
            "age": {
                "from": 18,
                "to": 25,
                "include_lower": true,
                "include_upper": false
            }
        }
    }
}

10、wildcard查询

允许使用通配符* 和 ?来进行查询
*代表0个或多个字符
?代表任意一个字符

GET /lib3/user/_search
{
    "query": {
        "wildcard": {
             "name": "wang*"
        }
    }
}
GET /lib3/user/_search
{
    "query": {
        "wildcard": {
             "name": "li?i"
        }
    }
}

11、fuzzy实现模糊查询

fuzzy 查询是 term 查询的模糊等价。

a、是 包含(contains) 操作,而非 等值(equals) (判断)。

b、不知道分词器的存在,所以不会去分词,

c、所谓的包含是文档分词结果某个分词是否包含,不是整个文档是否包含

d、因为是在分词结果中匹配,所以大写要转换为小写,大写字母是匹配不到

value:查询的关键字
boost:查询的权值,默认值是1.0
min_similarity:设置匹配的最小相似度,默认值为0.5,对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天
prefix_length:指明区分词项的共同前缀长度,默认是0
max_expansions:查询中的词项可以扩展的数目,默认可以无限大

GET /lib3/user/_search
{
    "query": {
        "fuzzy": {
             "interests": "chagge"
        }
    }
}
GET /lib3/user/_search
{
    "query": {
        "fuzzy": {
             "interests": {
                 "value": "chagge"
             }
        }
    }
}

12、高亮搜索结果

GET /lib3/user/_search
{
    "query":{
        "match":{
            "interests": "changge"
        }
    },
    "highlight": {
        "fields": {
             "interests": {}
        }
    }
}
目录
相关文章
|
9月前
|
存储 Unix 索引
ES常用查询命令
ES常用查询命令
128 2
|
9月前
|
关系型数据库 MySQL 分布式数据库
ES如何做到亿级数据查询毫秒级返回
ES如何做到亿级数据查询毫秒级返回
140 0
ES 布尔查询中 minimum_should_match 参数使用避坑
ES 布尔查询中 minimum_should_match 参数使用避坑
|
弹性计算 监控 Java
EDAS 基础排查
案例:应用发布失败 jvm crash 1) 先看下发布失败应用对应的变更记录发现发布应用失败是因为卡在了健康检查失败。健康检查的 URL 必须是返回 200 的才可以,通过报错可以知道后端的 tomcat 返回了 502。
2827 0
|
缓存 运维 负载均衡
通过Nginx、Consul、Upsync实现动态负载均衡和服务平滑发布
前段时间顺利地把整个服务集群和中间件全部从UCloud迁移到阿里云,笔者担任了架构和半个运维的角色。这里详细记录一下通过Nginx、Consul、Upsync实现动态负载均衡和服务平滑发布的核心知识点和操作步骤,整个体系已经在生产环境中平稳运行。编写本文使用的虚拟机系统为CentOS7.x,虚拟机的内网IP为192.168.56.200。
602 0
通过Nginx、Consul、Upsync实现动态负载均衡和服务平滑发布
|
缓存 流计算 分布式计算
Flink的分布式缓存
分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。
2045 0
|
Java 应用服务中间件
IDEA初次使用Tomcat运行项目(如何添加加载项目到Tomcat)
IDEA初次使用Tomcat运行项目(如何添加加载项目到Tomcat)
198 0
|
算法 Apache
使用 Apache Doris HyperLogLog 实现近似去重
在实际的业务场景中,随着业务数据量越来越大,对数据去重的压力也越来越大,当数据达到一定规模之后,使用精准去重的成本也越来越高,在业务可以接受的情况下,通过近似算法来实现快速去重降低计算压力是一个非常好的方式,本文主要介绍 Doris 提供的 HyperLogLog(简称 HLL)是一种近似去重算法。
800 0
|
关系型数据库 MySQL
ES复杂操作-布尔值查询(多条件精确查询)
ES复杂操作-布尔值查询(多条件精确查询)
|
弹性计算 网络协议 安全
外网连接不上RDS For MySQL
本地通过外网连接不上RDS For MySQL

热门文章

最新文章