Elasticsearch提供了基于JSON的完整查询DSL(特定于域的语言)来定义查询。将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:
1. Query and filter context 查询/过滤
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
term和range子句在过滤器上下文中使用。它们将过滤出不匹配的文档,但不会影响匹配文档的分数。
2.Match All Query 匹配全部
最简单的查询,它匹配所有文档,并为它们提供_score 1.0
GET /_search
{
"query": {
"match_all": {}
}
}
3.Full text queries 全文查询
3.1 Match Query 匹配查询
GET /_search
{
"query": {
"match" : {
"message" : "this is a test"
}
}
}
3.2 Match Phrase Query 短语查询
match_phrase查询将分析文本,并从分析的文本中创建短语查询。例如:
GET /_search
{
"query": {
"match_phrase" : {
"message" : "this is a test"
}
}
}
3.3 Match Phrase Prefix Query 词组前缀查询
match_phrase_prefix与match_phrase相同,只是它允许在文本的最后一项上进行前缀匹配。例如:
GET /_search
{
"query": {
"match_phrase_prefix" : {
"message" : "quick brown f"
}
}
}
它接受与短语类型相同的参数。此外,它还接受max_expansions参数(默认值为50),该参数可以控制将最后一项扩展到多少个后缀。强烈建议将其设置为可接受的值,以控制查询的执行时间。例如:
GET /_search
{
"query": {
"match_phrase_prefix" : {
"message" : {
"query" : "quick brown f",
"max_expansions" : 10
}
}
}
}
3.4 Multi Match Query 多字段查询
multi_match 查询为能在多个字段上反复执行相同查询提供了一种便捷方式。
multi_match 多匹配查询的类型有多种,其中的三种恰巧与 了解我们的数据 中介绍的三个场景对应,即: best_fields 、 most_fields 和 cross_fields (最佳字段、多数字段、跨字段)。
默认情况下,查询的类型是 best_fields ,这表示它会为每个字段生成一个 match 查询,然后将它们组合到 dis_max 查询的内部,如下:
multi_match查询以match查询为基础,以允许多字段查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "this is a test",
"fields": [ "subject", "message" ] ---要查询的字段。
}
}
}
----------------------------------------------------
字段可以用通配符指定,例如:
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ]
}
}
}
-----------------------------------------------------
可以使用插入号(^)表示法增强各个字段:
GET /_search
{
"query": {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^3", "message" ]
}
}
}
主题字段的重要性是消息字段的三倍。
3.5 Common Terms Query 常用术语查询
在此示例中,文档频率大于0.1%的单词(例如“ this”和“ is”)将被视为通用术语。
GET /_search
{
"query": {
"common": {
"body": {
"query": "this is bonsai cool",
"cutoff_frequency": 0.001
}
}
}
}
3.6 Query String Query 字符串查询
query_string查询可解析输入并在运算符周围拆分文本。每个文本部分彼此独立地进行分析。例如以下查询:
GET /_search
{
"query": {
"query_string" : {
"default_field" : "content",
"query" : "(new york city) OR (big apple)"
}
}
}
将被分为纽约市和大苹果,然后通过为该领域配置的分析仪对每个部分进行独立分析。
4.Term level queries 词级查询
全文查询将在执行之前分析查询字符串,而术语级查询将对存储在倒排索引中的确切术语进行操作,并在仅对具有normalizer属性的关键字字段执行之前对术语进行规格化。
这些查询通常用于结构化数据,例如数字,日期和枚举,而不是全文字段。或者,它们允许您在分析过程之前进行低级查询。
4.1Term Query 字词查询
术语查询查找包含倒排索引中指定的确切术语的文档。例如:
POST _search
{
"query": {
"term" : { "user" : "Kimchy" }
}
}
查找在用户字段的倒排索引中包含确切术语Kimchy的文档。
-----------------------------------------------
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"full_text": {
"type": "text"
},
"exact_value": {
"type": "keyword"
}
}
}
}
}
PUT my_index/_doc/1
{
"full_text": "Quick Foxes!",
"exact_value": "Quick Foxes!"
}
full_text字段为文本类型,将进行分析。 True_Value字段属于关键字类型,将不会进行分析。
4.2 Terms Query 多字段查询
GET /_search
{
"query": {
"terms" : { "user" : ["kimchy", "elasticsearch"]}
}
}
4.3 Range Query 范围查询
GET _search
{
"query": {
"range" : {
"age" : {
"gte" : 10,
"lte" : 20,
"boost" : 2.0
}
}
}
}
| 大于或等于 |
| 比...更棒 |
| 小于或等于 |
| 少于 |
| 设置查询的提升值,默认为 |
4.4 Exists Query 非空查询
返回原始字段中至少具有一个非null的文档:
GET /_search
{
"query": {
"exists" : { "field" : "user" }
}
}
匹配:
{ "user": "jane" }
{ "user": "" }
{ "user": "-" }
{ "user": ["jane"] }
不匹配:
{ "user": null }
{ "user": [] }
{ "user": [null] }
4.5 Prefix Query 前缀查询
匹配具有包含带有指定前缀(未分析)的术语的字段的文档。前缀查询映射到Lucene PrefixQuery。
以下匹配文档,其中用户字段包含以ki开头的术语:
GET /_search
{ "query": {
"prefix" : { "user" : "ki" }
}
}
4.6 Wildcard Query 通配符查询
支持的通配符是*,它匹配任何字符序列(包括空字符),以及?,它匹配任何单个字符。
请注意,此查询的速度可能很慢,因为它需要迭代许多项。
为了防止极慢的通配符查询,通配符术语不应以通配符*或?之一开头
GET /_search
{
"query": {
"wildcard" : { "user" : "ki*y" }
}
}
4.7 Regexp Query正则表达式查询
注意:regexp查询的性能在很大程度上取决于所选的正则表达式
匹配. *之类的内容非常慢,而且无法使用环视正则表达式。如果可能,应在正则表达式开始之前尝试使用长前缀。
诸如.*?+之类的通配符匹配器通常会降低性能
GET /_search
{
"query": {
"regexp":{
"name.first": "s.*y"
}
}
}
4.8 Fuzzy Query 模糊查询
模糊查询生成在模糊性指定的最大编辑距离内的匹配术语,然后检查术语字典以找出索引中实际存在的那些生成术语。最终查询最多使用max_expansions个匹配词。
GET /_search
{
"query": {
"fuzzy" : { "user" : "ki" }
}
}
5. Compound queries 复合查询
5.1 Bool Query bool查询
与文档匹配的查询,这些文档与其他查询的布尔组合匹配。
布尔查询映射到Lucene BooleanQuery。它是使用一个或多个布尔子句构建的,每个子句都具有类型的出现。
发生类型为:
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
}
}
}
| 子句(查询)必须出现在匹配的文档中,并将有助于得分。 |
| 子句(查询)必须出现在匹配的文档中。但是不像 |
| 子句(查询)应出现在匹配的文档中。如果 |
| 子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为用于缓存。由于忽略计分, |