elasticsearch的dsl查询
测试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查询的更多相关文章
- Elasticsearch Query DSL查询入门
本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...
- Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
目录 引言 概要 Query and filter context Match All Query 全文查询 Full text queries 小结 参考文档 引言 虽然之前做过 elasticse ...
- Elasticsearch文档查询
简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...
- ELK学习笔记(五)简单搜索和DSL查询
检索文档 现在我们有一些数据存储在Elasticsearch中,我们可以开始处理这个应用程序的业务需求. 这在Elasticsearch中很容易.我们只需执行HTTP GET请求并指定文档的地址--索 ...
- Elasticsearch Query DSL
Elasticsearch Query DSL By:授客 QQ:1033553122 1. match_all 1 2. match 2 3. match_phrase 5 4. match_phr ...
- Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
目录 引言 构建示例 match operator 参数 analyzer lenient 参数 Fuzziness fuzzniess 参数 什么是模糊搜索? Levenshtein Edit Di ...
- Elasticsearch 常用基本查询
安装启动很简单,参考官网步骤:https://www.elastic.co/downloads/elasticsearch 为了介绍Elasticsearch中的不同查询类型,我们将对带有下列字段的文 ...
- ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解
前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...
- Elasticsearch Query DSL(查询语言)
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
随机推荐
- 八、Abp vNext 基础篇丨标签聚合功能
介绍 本章节先来把上一章漏掉的上传文件处理下,然后实现Tag功能. 上传文件 上传文件其实不含在任何一个聚合中,它属于一个独立的辅助性功能,先把抽象接口定义一下,在Bcvp.Blog.Core.App ...
- Identity角色管理三(编辑角色)
因只有角色名能修改故继续使用创建角色的视图模型 using System.ComponentModel; using System.ComponentModel.DataAnnotations; na ...
- Vue指令及自定义指令的使用
导航列表: 一.vue指令 二.自定义指令 一.vue指令 回到顶部 1. v-text v-text主要用来更新textContent,可以等同于JS的text属性,不会解析标签,会把标签解析 ...
- 放码来战!HMS Core线上Codelabs挑战赛正式开始
亲爱的开发者,在1024程序员节即将到来之际,HMS Core准备了一场线上Codelabs挑战赛,现向你发出诚挚邀请,希望你能将新奇的想法和对产品的思考融入代码,用技术与世界对话. HMS Core ...
- JavaScript循环 — for、for/in、while、do/while
for 多次遍历代码块 const array = []for (var i = 0; i < 5; i++) { array.push(i)}console.log(array) // [0, ...
- Java集合:HashMap
Hashmap是一个存储key-value的映射表. 优点: 索引数据快,查找一个数据对的时间复杂度是O(1) 增加.删除一个数据的时间复杂度是O(1) key不能重复,可以存储一个null值 存储: ...
- Django学习day06随堂笔记
每日测验 """ 今日考题 1.什么是FBV与CBV,能不能试着解释一下CBV的运作原理 2.模版语法的传值需要注意什么,常见过滤器及标签有哪些 3.自定义过滤器,标签, ...
- 彻底搞明白PHP的中引用的概念
之前我们其实已经有过几篇文章讲过引用方面的问题,这次我们来全面的梳理一下引用在PHP到底是怎么回事,它和C中的指针有什么不同,在使用的时候要注意些什么. 什么是引用? 在 PHP 中引用意味着用不同的 ...
- symfony2已有数据表导入实体时报错 Doctrine does not support reverse engineering from tables that don't have a primary key
先在配置文件 app/config/config.yml中配置 schema_filter: /^(?!(tablename))/ 即可,或者在出现问题表都加上一个id 然后再使用命令 php app ...
- linux重启mysql
一. 启动1.使用 service 启动:service mysql start2.使用 mysqld 脚本启动:/etc/inint.d/mysql start3.使用 safe_mysqld 启动 ...