Elasticsearch搜索引擎第十篇-Query DSL详解
文章目录
- DSL介绍
- Match all query
- 全文查询
- match query
- match phrase query
- match phrase prefix query
- multi match query
- query string query
- simple query string query
- 词项查询
- term query
- terms query
- range query
- exits query
- prefix query 词项前缀查询
- wildcard query 通配符查询
- regexp query 正则查询
- fuzzy query 模糊查询
- ids 根据文档id查询
- 复合查询
- constant score query
- bool query
官网介绍链接: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
DSL介绍
Domain Specific Language:领域特定语言
Elasticsearch基于JSON提供完整的查询DSL来定义查询。
一个查询可由两部分字句构成:
- Leaf query clauses 叶子查询字句:Leaf query clauses 在指定的字段上查询指定的值, 如:match, term or range queries. 叶子字句可以单独使用.
- Compound query clauses 复合查询字句:以逻辑方式组合多个叶子、复合查询为一个查询
一个查询字句的行为取决于它是用在query context 还是 filter context 中:
- Query context 查询上下文:用在查询上下文中的字句回答“这个文档有多匹配这个查询?”。除了决定文档是否匹配,字句匹配的文档还会计算一个字句评分,来评定文档有多匹配,会参与相关性评分。查询上下文由 query 元素表示。
- Filter context 过滤上下文:过滤上下文由 filter 元素或 bool 中的 must not 表示。用在过滤上下文中的字句回答“这个文档是否匹配这个查询?”,不参与相关性评分。被频繁使用的过滤器将被ES自动缓存,来提高查询性能。
如下语句:
GET /_search
{"query": { "bool": { "must": [{ "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ],"filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ]}}
}
query负责在查询上下文中使用查询字句来表示影响匹配文档得分的条件,filter负责在过滤上下文中使用所有其他查询字句
Match all query
查询所有
GET /_search
{"query": {"match_all": {}}
}GET /_search
{"query": {"match_none": {}}
}
全文查询
官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html
全文查询,用于对分词的字段进行搜索。会用查询字段的分词器对查询的文本进行分词生成查询。可用于短语查询、模糊查询、前缀查询、临近查询等查询场景。
match query
全文查询的标准查询,它可以对一个字段进行模糊、短语查询。 match queries 接收 text/numerics/dates, 对它们进行分词分析, 再组织成一个boolean查询。可通过operator 指定bool组合操作(or、and 默认是 or ), 以及minimum_should_match 指定至少需多少个should(or)字句需满足。还可用ananlyzer指定查询用的特殊分析器。
GET /_search
{"query": {"match" : {"message" : "this is a test" #message是字段名}}
}
新增两个文档:
PUT /ftq/_doc/1
{"title": "lucene solr and elasticsearch","content": "lucene solr and elasticsearch for search"
}PUT /ftq/_doc/2
{"title": "java spring boot","content": "lucene is writerd by java"
}
执行查询:
GET ftq/_search
{"query": {"match": {"title": "lucene java" #分词后用or}}
}GET ftq/_search
{"query": {"match": {"title": {"query": "lucene java","operator": "and" #指定分词后用and}}}
}
模糊查询,可以指定fuzziness最大编辑数
- 最大编辑数为2,说明query字符串中分词后,每个词允许编辑两次单个字符,可删除、新增、修改字符
- fuzziness 参数可以被设置为 AUTO,此时字符串只有 1 到 2 个字符时是 0;字符串有 3 、4 或者 5 个字符时是 1;字符串大于 5 个字符时是 2
- 有时编辑距离 2 仍然是太多了,返回的结果似乎并不相关。 把最大 fuzziness 设置为 1 ,可以得到更好的结果和更好的性能
GET ftq/_search
{"query": {"match": {"title": {"query": "ucen elatic","fuzziness": 2}}}
}
关于模糊查询fuzziness的说明,可以参看:https://www.elastic.co/guide/cn/elasticsearch/guide/current/fuzziness.html
还可以使用minimum_should_match指定最少需要满足几个词匹配:
GET ftq/_search
{"query": {"match": {"content": {"query": "ucen elatic java","fuzziness": 2,"minimum_should_match": 2}}}
}
还可用max_expansions 指定模糊匹配的最大词项数,默认是50。比如:反向索引中有 100 个词项与 ucen 模糊匹配,只选用前50 个。
GET ftq/_search
{"query": {"match": {"content": {"query": "ucen elatic java","fuzziness": 2,"minimum_should_match": 2,"max_expansions ": 50}}}
}
match phrase query
match_phrase 查询用来对一个字段进行短语查询,可以指定 analyzer、slop移动因子。
GET ftq/_search
{"query": {"match_phrase": {"title": "lucene solr"}}
}GET ftq/_search
{"query": {"match_phrase": {"title": {"query": "lucene elasticsearch","slop": 2}}}
}
match phrase prefix query
match_phrase_prefix 在 match_phrase 的基础上支持对短语的最后一个词进行前缀匹配
查询f开头的:
GET /_search
{"query": {"match_phrase_prefix" : {"message" : "quick brown f"}}
}
指定前缀匹配选用的最大词项数量:
GET /_search
{"query": {"match_phrase_prefix" : {"message" : {"query" : "quick brown f","max_expansions" : 10}}}
}
multi match query
如果你需要在多个字段上进行文本搜索,可用multi_match 。multi_match在 match的基础上支持对多个字段进行文本查询。
GET ftq/_search
{"query": {"multi_match" : {"query": "lucene java", "fields": [ "title", "content" ] }}
}
还可以使用*匹配多个字段:
GET ftq/_search
{"query": {"multi_match" : {"query": "lucene java", "fields": [ "title", "cont*" ] }}
}
query string query
query_string 查询,让我们可以直接用lucene查询语法写一个查询串进行查询,ES中接到请求后,通过查询解析器解析查询串生成对应的查询。使用它要求掌握lucene的查询语法。
GET /_search
{"query": {"query_string" : {"default_field" : "content","query" : "this AND that OR thus"}}
}GET /_search
{"query": {"query_string" : {"fields" : ["content", "name"],"query" : "this AND that OR thus"}}
}
可与query同用的参数,如 default_field、fields,及query 串的语法请参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
simple query string query
simple_query_string 查同 query_string 查询一样用lucene查询语法写查询串,较query_string不同的地方:更小的语法集;查询串有错误,它会忽略错误的部分,不抛出错误。更适合给用户使用。
GET /_search
{"query": {"simple_query_string" : {"query": "\"fried eggs\" +(eggplant | potato) -frittata","fields": ["title^5", "body"],"default_operator": "and"}}
}
语法请参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html
词项查询
官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/term-level-queries.html
term query
term 查询用于查询指定字段包含某个词项的文档。
POST _search
{"query": {"term" : { "user" : "Kimchy" } }
}
terms query
terms 查询用于查询指定字段包含某些词项的文档。
GET /_search
{"query": {"terms" : { "user" : ["kimchy", "elasticsearch"]}}
}
Terms 查询支持嵌套查询的方式来获得查询词项,相当于 in (select term from other)
PUT /users/_doc/2
{"followers" : ["1", "3"]
}PUT /tweets/_doc/1
{"user" : "1"
}GET /tweets/_search
{"query" : {"terms" : {"user" : {"index" : "users","type" : "_doc","id" : "2","path" : "followers"}} }
}
嵌套查询可用参数说明:
range query
范围查询
- gte:大于等于
- gt:大于
- lte:小于等于
- lt:小于
- boost:查询权重
GET _search
{"query": {"range" : {"age" : {"gte" : 10,"lte" : 20,"boost" : 2.0}}}
}GET _search
{"query": {"range" : {"date" : {"gte" : "now-1d/d", #当前时间减1天后转成天数"lt" : "now/d" #当前时间转成条数}}}
}GET _search
{"query": {"range" : {"born" : {"gte": "01/01/2012","lte": "2013","format": "dd/MM/yyyy||yyyy"}}}
}
时间舍入||说明:
- gt:大于的情况下,四舍五入,比如2014-11-18||/M变成2014-11-30T23:59:59:999,不包含整个月
- gte:大于等于的情况下,向下取整,比如2014-11-18||/M变成2014-11-01,包含整个月
- lt:小于的情况下,向下取整,比如2014-11-18||/M变成2014-11-01,不包含整个月
- lte:小于等于的情况下,四舍五入,比如2014-11-18||/M变成2014-11-30T23:59:59:999,包含整个月
时间数学计算规则请参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math
exits query
查询指定字段值不为空的文档。相当 SQL 中的 column is not null
GET /_search
{"query": {"exists" : { "field" : "user" }}
}
prefix query 词项前缀查询
GET /_search
{ "query": {"prefix" : { "user" : "ki" }}
}
wildcard query 通配符查询
GET /_search
{"query": {"wildcard" : { "user" : "ki*y" }}
}GET /_search
{"query": {"wildcard": {"user": {"value": "ki*y","boost": 2}}}}
regexp query 正则查询
GET /_search
{"query": {"regexp":{"name.first": "s.*y"}}
}GET /_search
{"query": {"regexp":{"name.first":{"value":"s.*y","boost":1.2}}}
}
正则语法参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax
fuzzy query 模糊查询
GET /_search
{"query": {"fuzzy" : { "user" : "ki" }}
}GET /_search
{"query": {"fuzzy" : {"user" : {"value": "ki","boost": 1.0,"fuzziness": 2,"prefix_length": 0,"max_expansions": 100}}}
}
ids 根据文档id查询
GET /_search
{"query": {"ids" : {"type" : "_doc","values" : ["1", "4", "100"]}}
}
复合查询
官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/compound-queries.html
constant score query
用来包装另一个查询,将查询匹配的文档的评分设为一个常值。
GET /_search
{"query": {"constant_score" : {"filter" : {"term" : { "user" : "kimchy"}},"boost" : 1.2}}
}
bool query
Bool 查询用bool操作来组合多个查询字句为一个查询。 可用的关键字:
- must:必须满足
- filter:必须满足,但执行的是filter上下文,不参与、不影响评分
- should:或
- must_not:必须不满足,在filter上下文中执行,不参与、不影响评分
POST _search
{"query": {"bool" : {"must" : {"term" : { "user" : "kimchy" }},"filter": {"term" : { "tag" : "tech" }},"must_not" : {"range" : {"age" : { "gte" : 10, "lte" : 20 }}},"should" : [{ "term" : { "tag" : "wow" } },{ "term" : { "tag" : "elasticsearch" } }],"minimum_should_match" : 1,"boost" : 1.0}}
}
Elasticsearch搜索引擎第十篇-Query DSL详解相关推荐
- SpringBoot第十篇:thymeleaf详解
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10931435.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 Sprin ...
- AUTOSAR从入门到精通100讲(四十九)-AUTOSAR 通信服务Dcm篇-Dcm概念及DSL详解与实战案例
Dcm概念及DSL详解 正文 1. Introduction and functional overview 诊断通信管理(Diagnostic Communication Manager, DCM) ...
- MySQL数据库,从入门到精通:第十四篇——MySQL视图详解
MySQL数据库,从入门到精通:第十四篇--MySQL视图详解 第 14 篇_视图 1. 常见的数据库对象 2. 视图概述 2. 1 为什么使用视图? 2. 2 视图的理解 3. 创建视图 3. 1 ...
- MySQL数据库,从入门到精通:第十二篇——MySQL数据类型详解
MySQL数据库,从入门到精通:第十二篇--MySQL数据类型详解 第 12 章_MySQL数据类型精讲 1. MySQL中的数据类型 2. 整数类型 2. 1 类型介绍 2. 2 可选属性 2. 2 ...
- mysql入门优化_MySQL数据库:MySQL十大优化技巧详解
本文主要向大家介绍了MySQL数据库的MySQL十大优化技巧详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是 ...
- 大数据是什么和大数据技术十大核心原理详解
一.数据核心原理 从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据&quo ...
- 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型
1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...
- Gartner:2018年十大安全项目详解
Gartner 2018年十大安全项目详解 Last Modified By Bennyye @ 2018-11-20 1 概述 2018年6月份,一年一度的Gartner安全与风险管理峰会上 ...
- 大数据技术十大核心原理详解
一.数据核心原理--从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据"核心 ...
最新文章
- 关于Activity class {package/class} does not exist
- Leetcode 118:Pascal's Triangle 杨辉三角
- 软件外包项目管理的经验感悟
- asp.net中page对象生命周期和各事件执行顺序
- Oracle JDK 和 OpenJDK 有什么区别?
- offset系列,client系列,scroll系列回顾
- 在java web工程中jsp页面中使用kindeditor
- python编辑器_推荐一款Python编辑器,集Pycharm和Sublime优点于一身的王者
- React之事件处理
- python进阶05并发之一基本概念
- AS3程序性能优化建议
- IE10 CSS hack
- 渗透测试-postmessage xss
- 西门子系列PLC教学视频资源4——S7-1200
- Visual Studio 2013安装教程
- seaweedfs入门
- 免费FTP资源(比较全)
- 【第二届PHP全球开发者大会】惠新宸(鸟哥):PHP7性能之源
- Gazebo物理仿真环境搭建 实例
- 微信公众平台模拟登录自动群发图文消息工具包
热门文章
- 万家杨柳青烟里:B+、B- 树的应用场景
- 基于c语言矩阵数组透视变换,一种图像透视变换方法与流程
- php内容怎么设置隐藏,在PHP中设置隐藏元素的值 - php
- 如何在短时间内成为数据分析师
- Python正则表达式 .,[],\d,\w,\s,\S,\D,\W的用法
- 帝国建站php,帝国cms支持php吗
- javaweb编辑器ckeditor配置_ckeditor (一)在java web中的配置
- 第一个Python程序-HelloWorld与Python解释器
- Flask-SocketIO的使用
- HBase+Spark技术双周刊第一期