测试es的dsl查询,准备数据,在插入数据的时候,如果index、type、mapping都没有,es会自动创建

一、数据的准备

curl -XPOST "http://192.168.99.1:9200/new_index/product/p1" -d'
{
"name":"new Mac Book"
}' curl -XPOST "http://192.168.99.1:9200/new_index/product/p2" -d'
{
"name":"note book",
"price":12345,
"cats":["notes"]
}' curl -XPOST "http://192.168.99.1:9200/new_index/product/p3" -d'
{
"name":"apples",
"price":4,
"cats":["fruit"]
}' curl -XPOST "http://192.168.99.1:9200/new_index/product/p4" -d'
{
"name":"pen",
"price":50
}' curl -XPOST "http://192.168.99.1:9200/new_index/product/p5?routing=p5" -d'
{
"name":"add document use routing"
}' curl -XPOST "http://192.168.99.1:9200/new_index/product/p6" -d'
{
"name":"I love apples too.",
"price":60
}'

二、修改name字段的mapping

注意:1、mapping是要在创建索引的时候创建好,已经创建好的field的mapping不可再次修改,但是可以新增field的mapping

2、在es5中,需要设置text类型字段的fielddata=true,不然下方的查询会报错

curl -XPOST "http://192.168.99.1:9200/new_index/_mapping/product" -d'
{
"properties": {
"name":{
"type": "text",
"fielddata": true
}
}
}'

三、查询出price在1-200之间,且name属性中必须不包含pen,按照price降序,name升序,对返回的结果进行分页,_source中的数据进行过滤,返回name字段分词后的term数据

注意:已经分词过的字段不建议排序,耗性能,而且排序也不一定能得到想要的结果
    

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
"explain": true,
"from": 0,
"size": 20,
"fielddata_fields" : ["name"],
"_source": {
"include": ["name*","price"],
"exclude": ["name"]
},
"version": true,
"query": {
"bool": {
"must": [
{
"range": {
"price": {
"gte": 1,
"lte": 200
}
}
}
],
"must_not": [
{
"term": {
"name": {
"value": "pen"
}
}
}
]
}
},
"sort": [
{
"price": "desc"
},
{
"name" : {
"order": "asc"
}
}
]
}'

四、统计price在1-200之间,且name属性中必须不包含pen的数据的数量

curl -XGET "http://192.168.99.1:9200/new_index/product/_count" -d'
{
"query": {
"bool": {
"must": [
{
"range": {
"price": {
"gte": 1,
"lte": 200
}
}
}
],
"must_not": [
{
"term": {
"name": {
"value": "pen"
}
}
}
]
}
}
}'

五、查询price在1-200之间,且name属性中必须不包含pen的数据是否存在

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
"size":0,
"terminate_after":1,
"query": {
"bool": {
"must": [
{
"range": {
"price": {
"gte": 1,
"lte": 200
}
}
}
],
"must_not": [
{
"term": {
"name": {
"value": "pen"
}
}
}
]
}
}
}'

六、查询id为p1,p3,p4的数据

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
"query": {
"ids": {
"values": ["p1","p2","p3"]
}
}
}'

如果上方的查询url中没有指定type,那么也是可以在ids下方指定type的

七、查询文档中一定包含price字段的文档

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
"query": {
"exists" : {
"field" : "price"
}
}
}'

八、通配符查询,查询name字段是bo*k这种格式的

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
"query": {
"wildcard": {
"name": {
"value": "bo*k"
}
}
}
}'

九、query和filter一起结合使用

需求:过滤出price在1-200之间,name中包含apples

注意:1、query查询需要考虑到文档的相关性评分,而filter不需要。

2、filter查询的结果会缓存,速度比query要快

3、一般需要做全文检索的字段或需要考虑到相关度评分的字段使用query查询,其余的可以考虑使用filter过滤。

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
"query": {
"bool": {
"filter": {
"range": {
"price": {
"gte": 1,
"lte": 200
}
}
},
"must": [
{
"term": {
"name": {
"value": "apples"
}
}
}
]
}
}
}'

十、match匹配查询

operator:

and :  表示query中的数据分词后的都需要匹配上。

or    :  表示query中的数据分词后任意一个匹配上即可。(默认)

minimum_should_match : 里面的值写百分比,即query中的词分词后,满足minimum_should_match这个里面的百分比即可。默认最少需要匹配一个。(如果query中的词可以分成3个term,配置的百分比为80%,那么3*0.8最终需要匹配2个)
  
 十一、multi_match查询,从多个字段中查询

注意:fields中写的是多个字段

type 的值有多个,不同的值会影响文档的得分

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
"query": {
"multi_match": {
"query": "apples",
"fields": ["name","descs"],
"type": "best_fields"
}
}
}'

elasticsearch的dsl查询的更多相关文章

  1. Elasticsearch Query DSL查询入门

    本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...

  2. Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述

    目录 引言 概要 Query and filter context Match All Query 全文查询 Full text queries 小结 参考文档 引言 虽然之前做过 elasticse ...

  3. Elasticsearch文档查询

    简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...

  4. ELK学习笔记(五)简单搜索和DSL查询

    检索文档 现在我们有一些数据存储在Elasticsearch中,我们可以开始处理这个应用程序的业务需求. 这在Elasticsearch中很容易.我们只需执行HTTP GET请求并指定文档的地址--索 ...

  5. Elasticsearch Query DSL

    Elasticsearch Query DSL By:授客 QQ:1033553122 1. match_all 1 2. match 2 3. match_phrase 5 4. match_phr ...

  6. Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了

    目录 引言 构建示例 match operator 参数 analyzer lenient 参数 Fuzziness fuzzniess 参数 什么是模糊搜索? Levenshtein Edit Di ...

  7. Elasticsearch 常用基本查询

    安装启动很简单,参考官网步骤:https://www.elastic.co/downloads/elasticsearch 为了介绍Elasticsearch中的不同查询类型,我们将对带有下列字段的文 ...

  8. ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解

    前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...

  9. Elasticsearch Query DSL(查询语言)

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

随机推荐

  1. 交换机之vlan详解

    一.为什么需要VLAN 1.1.什么是VLAN? VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算 ...

  2. C语言实现任务调度与定时器

    代码实现是在xl2tpd的源码中get到的,感觉很有意思的一段代码.基本功能就是实现定时器,时间到后从定时队列中取出,然后完成指定的任务. 1. schedule.c代码(自己添加了main函数,用来 ...

  3. MySQL实战45讲(06--10)-笔记

    目录 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍? 全局锁 表级锁 小结 07 | 行锁功过:怎么减少行锁对性能的影响? 死锁和死锁检测 08 | 事务到底是隔离的还是不隔离的? &quo ...

  4. MySQL查询结果集字符串操作之多行合并与单行分割

    前言 我们在做项目写sql语句的时候,是否会遇到这样的场景,就是需要把查询出来的多列,按照字符串分割合并成一列显示,或者把存在数据库里面用逗号分隔的一列,查询分成多列呢,常见场景有,文章标签,需要吧查 ...

  5. FastAPI(5)- get 请求 - 查询参数 Query Parameters

    什么是查询参数? http://127.0.0.1:8000/get?name=xxx&age=18 http://127.0.0.1:8000/get?age=18&name=xxx ...

  6. PHP的zip压缩工具扩展包学习

    总算到了 PHP 的拿手好戏上场了,前面我们学习过 Bzip2 . LZF . Phar 和 rar 这些压缩相关扩展在 PHP 中的使用,不过它们要么是太冷门,要么就是很多功能不支持.而 Zip 则 ...

  7. win8 连接到OneDrive时出现问题-感叹号

    显示最后更新时间是1970年... 还有感叹号,没法同步 解决办法: 管理员运行cmd命令: 输入"netsh int ip reset c: esetlog.txt",按下回车键 ...

  8. mysql更新数据时:当想mysql某插入有某字段设置了unique且和之前相同时,会报错,并停止运行

    这个在mysql5.7会报错: 如openid设为unique: 1062 - Duplicate entry 'oTfYq6PKne00IrcTqphmKqKnsahM' for key 'qx_w ...

  9. Java基础系列(20)- while循环

    循环结构 while循环 do-循环 for循环 在java5中引入了一种主要用于数组的增强型for循环 while循环 while是最基本的循环,它的结构为 while(布尔表达式){ //循环内容 ...

  10. Shell系列(39) - dirname

    dirname作用 dirname实际工作中常常是跟$0一起使用 用于获取当前运行脚本的绝对路径 这个命令要放在shell脚本中使用,在命令行使用意义不大 [yutao@master01 ~]$ di ...