1 基本使用

  使用kibaba来执行语句

  es安装和kibaba安装:https://www.cnblogs.com/jthr/p/17075759.html

1)添加PUT

  已存在会直接覆盖

PUT /myindex/_doc/1
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"美国有苹果,中国有菠萝"
}

2)修改POST

POST/myindex/_doc/1
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"美国有苹果,中国有菠萝"
}

3)查询GET

GET /jsnh/user/1/

4)删除DELETE

DELETE /jsnh/user/1/

2 查询

2.1 测试数据准备

PUT /product/_doc/1
{
"name" : "xiaomi phone",
"desc" : "shouji zhong de zhandouji",
"price" : 3999,
"tags": [ "xingjiabi", "fashao", "buka" ]
}
PUT /product/_doc/2
{
"name" : "xiaomi nfc phone",
"desc" : "zhichi quangongneng nfc,shouji zhong de jianjiji",
"price" : 4999,
"tags": [ "xingjiabi", "fashao", "gongjiaoka" ]
} PUT /product/_doc/3
{
"name" : "nfc phone",
"desc" : "shouji zhong de hongzhaji",
"price" : 2999,
"tags": [ "xingjiabi", "fashao", "menjinka" ]
} PUT /product/_doc/4
{
"name" : "xiaomi erji",
"desc" : "erji zhong de huangmenji",
"price" : 999,
"tags": [ "low", "bufangshui", "yinzhicha" ]
} PUT /product/_doc/5
{
"name" : "hongmi erji",
"desc" : "erji zhong de kendeji",
"price" : 399,
"tags": [ "lowbee", "xuhangduan", "zhiliangx" ]
}

2.2 简单查询

1)查询product/_doc下所有

GET /product/_doc/_search

2)简单条件查询

  返回name中包含xiaomi或者phone的关键字的

  es采取的是关键字查询索引,xiaomi phone会被分词分为 xiaomi和phone,再去查找索引

GET /product/_doc/_search?q=name:xiaomi phone

3)简单条件+分页排序

  页码为0,每页为2,安装price排正序

GET /product/_doc/_search?q=name:xiaomi phone&from=0&size=2&sort=price:asc

2.3 复杂查询

2.3.1 查询所有match_all

  无条件查询所有

    GET /product/_doc/_search
{
"query":{
"match_all": {}
}
}

2.3.2 单字段条件查询match

  match会对查询条件进行分词处理,得到一些关键字,然后每个关键字去相等匹配,只要有一个匹配到,就可以返回,再根据相关度排序

  返回name中包含xiaomi或者phone关键字的

        GET /product/_doc/_search
{
"query":{
"match": {
"name":"xiaomi phone"
}
}
}

2.3.3 多字段条件匹配multi_match

  multi_match和match的区别在于,可以对多个字段进行匹配查询

  查询name字段或desc字段中包含phone关键字的的,multi_match多个字段单条件去匹配

    GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
}
}

2.3.4 排序sort

    GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
},
"sort":{
"price":"asc"
}
}

2.3.5 指定返回字段

  可以指定只返回部分字段,不用全部字段都返回

  只返回字段name和price

    GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"]
}

2.3.6 分页

GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"],
"from":0,
"size":2
}

2.3.7 不分词查询term

  查询条件不会被分词,而是整个作为一个关键字去查询

  获取name包含关键字xiaomi erji的,由于关键字中没有xiaomi erji,只有xiaomi和erji这两个关键字,所以查不到

GET /product/_doc/_search
{
"query":{
"term": {
"name":"xiaomi erji"
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"],
"from":0,
"size":2
}

2.3.8 不分词查询terms

  和term的区别在于,对一个字段可以查询多个条件,满足一个就可以

  获取name包含关键字包含xiaomi erji或者phone关键字的

    GET /product/_doc/_search
{
"query":{
"terms": {
"name":["hongmi erji","phone"]
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"],
"from":0,
"size":2
}

2.3.9 验证分词会怎么分_analyze

  查询字符串"xiaomi nfc zhineng phone huhu"会被分成哪几个关键词

 GET /_analyze
{
"analyzer": "standard",
"text":"xiaomi nfc zhineng phone huhu"
}

2.3.10 短语搜索match_phrase

  match_phrase还是分词后去搜的

  目标文档需要包含分词后的所有关键词

  目标文档还要保持这些词的顺序和文档中的一致

  添加测试数据

PUT /myindex/_doc/1
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"USA has apple China has pineapple"
}
PUT /myindex/_doc/2
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"USA has apple China has pear"
} PUT /myindex/_doc/3
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"USA has apple China has pear and pineapple"
}

  查询

GET /myindex/_search
{
"query":{
"match_phrase":{
"desc":"China has pineapple"
}
}
}

  查询结果,只有一条。说明match_phrase是分词后去查询的,且查询的结果必须包含查询条件的这几个关键词,且顺序连续一致

{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.6026137,
"hits" : [
{
"_index" : "myindex",
"_type" : "mytype",
"_id" : "1",
"_score" : 0.6026137,
"_source" : {
"id" : 1,
"name" : "手机",
"price" : 3888.8,
"desc" : "USA has apple China has pineapple"
}
}
]
}
}

2.4 组合条件查询bool

  bool标识组合条件

2.4.1 must

  must标识必须满足的条件

1)查询name中包含xiaomi关键字的并且desc中包含shouji关键字的

{
"query":{
"bool":{
"must":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
]
}
}
}

2.4.2 filter

  filter也是必须满足的条件,和must的区别是不计相关度分数。

1)查询name包含xiaomi关键字的,desc包含shouji关键字的,price大于4000的(这个条件不参与相关度分数的计算)

GET /product/_doc/_search
{
"query":{
"bool":{
"must":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"filter":[
{
"range":{
"price":{
"gt":4000
}
}
}
]
}
}
}

2.4.3 should

  相当于or匹配

  minimum_should_match表示shoule中的条件有几个必须满足,可以为0。

  如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。否则,默认值为0

1)查询出name包含xiaomi关键字或者desc包含shouji关键字的 

    GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":1
}
}
}

2)查询出name包含xiaomi关键字并且desc包含shouji关键字的

    GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":2
}
}
}

3)如下,因为存在must,所以minimum_should_match值为0,相当于should里的条件不存在,也就是查询price大于1999的

GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"must":[
{
"range":{
"price":{
"gt":1999
}
}
}
]
}
}
}

4)查询价格大于1999,并且(name包含xiaomi关键字或者desc包含shouji关键字)

GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":1,
"must":[
{
"range":{
"price":{
"gt":1999
}
}
}
]
}
}
}

5)查询价格大于1999,并且(name包含xiaomi关键字,并且desc包含shouji关键字)

GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":2,
"must":[
{
"range":{
"price":{
"gt":1999
}
}
}
]
}
}
}

2.4.4 must not

  必须不满足,且不计算相关度分数

1)查询价格不能大于4000的,也就是价格小于等于4000的

GET /product/_doc/_search
{
"query":{
"bool":{
"must_not":[
{
"range":{
"price":{
"gt":4000
}
}
}
]
}
}
}

ES的基本语法的更多相关文章

  1. Node.js 全栈开发(二)——ES 201x 新语法的使用之基础篇

    在讲 ES 2015 新语法之前,先来说一下为什么叫 ES.JavaScript 是这门语言的名称,它有一个为它制定标准化的组织 European Computer Manufacturers Ass ...

  2. ES 6新语法

    一.块级作用域绑定 回顾:使用var关键字定义变量 定义 = 声明 + 赋值:   1. 可以一次定义多个变量 2. 定义时可以只声明不赋值 3. 定义之后可以随时修改变量的值 4. 变量声明会被提升 ...

  3. ES常用查询语法

    1.query string search GET /index/type/_search?q=name:zhangsan&sort=age:desc 2.query DSL(Domain S ...

  4. es聚合查询语法

    {    "size": 0,    "query": {        "bool": {            "filter ...

  5. 009 webpack将ES高级语法进行装换

    一:ES高级转换 1.main.js中的js不能解析 // js的主要入口 import $ from 'jquery' import './css/index.css' import './css/ ...

  6. 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法

    一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...

  7. ES 08 - 创建、查看、修改、删除、关闭Elasticsearch的index

    目录 1 创建index(配置mapping[映射]) 2 查看index 3 修改index 4 删除index 5 打开/关闭index 6 常见问题及解决方法 index相当于RDBMS(关系型 ...

  8. 47.serch基本语法

    主要知识点 1._search api基本语法 2.http协议中get请求带上request body     一.search api的基本语法     1.GET /_search {所传递的参 ...

  9. ES 调优查询亿级数据毫秒级返回!怎么做到的?--文件系统缓存

    一道面试题的引入: 如果面试的时候碰到这样一个面试题:ElasticSearch(以下简称ES) 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因 ...

  10. es相关

    1.es在数据量很大的情况下(数十亿级别)如何提高查询性能啊? 2.es生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 3.es的分布式架构原理能说一下么(es是如何 ...

随机推荐

  1. Halcon使用MeasurePos来实现检测边缘点

    (1)为了提高性能,测量句柄只需要初始化一次: 参数:测量矩形的中心点行坐标,测量矩形中心的列坐标,测量矩形的角度,测量矩形的宽,测量矩形的高,待处理图像的宽,待处理图像的高,使用的算法,输出测量句柄 ...

  2. spring运行报500 bean不存在

    spring运行报500 bean不存在 bean不存在 步骤: ​ 查看bean是否注入成功 ​ junit单元测试 ​ 问题,不一定在我们底层,是spring出现了问题 ​ SpringMVC整合 ...

  3. Google地图瓦片

    1.Web墨卡托空间参考 1.1.什么是Web墨卡托 墨卡托投影,又称正轴等角圆柱投影,由荷兰地图学家墨卡托(G.Mercator)于1569年创拟.假设地球被套在一个圆柱中,赤道与圆柱相切,然后在地 ...

  4. Js前端导出csv

    var myMemory = myObjectStore.objectStore; var myDataArray = myMemory.data; var myCsvString = "\ ...

  5. 【zookeeper】Zookeeper相关概念、重难点(myid)、语法、使用、工具

    1234567890 1请按照我是想额度插入fvtgb6yhn7ujm8ik,9ol.

  6. EPSS 解读:与 CVSS 相比,孰美?

    通用漏洞评分系统(CVSS)是当前应用最频繁的评分系统以评估安全漏洞的严重性.但是,由于该系统在评估漏洞和优先级排序方面存在不足而遭受批评.因此,有部分专业人士呼吁使用漏洞利用预测评分系统(EPSS) ...

  7. 干货 | 如何快速实现 BitSail Connector?

    简介 本文面向 BitSail 的 Connector 开发人员,通过开发者的角度全面的阐述开发一个完整 Connector 的全流程,快速上手 Connector 开发. 目录结构 首先开发者需要通 ...

  8. 不用USB,通过adb无线调试安卓手机页面

    以前真机调试手机页面,都是使用数据线连接手机和电脑,近日身边没有USB数据线,折腾了下如何不依赖数据线只用无线调试手机页面,教程如下. 本教程适用于安卓11以及以上版本.否则应该使用USB数据线连接. ...

  9. JavaScript:操作符:正负号和自增自减及其隐式转换数据类型

    正负号 正号即加号,负号即减号,运算结果同数学意义一样: 对非数字类型进行正负号运算,会隐式转换为数字,再进行运算: 一些特殊的非数字,转换情况同算术运算符: 自增自减 自增即为++,自减即为--. ...

  10. 红袖添香,绝代妖娆,Ruby语言基础入门教程之Ruby3基础数据类型(data types)EP02

    Ruby是强类型动态语言,即Ruby中一旦某一个对象被定义类型,如果不通过强制转换操作,那么它永远就是该数据类型,并且只有在Ruby解释器运行时才会检测对象数据类型,它的一切皆为对象(包括 nil 值 ...