Elasticsearch两种查询
- url 搜索 e.g.
GET twitter/_search?q=user:kimchy
- DSL查询语言
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
DSL(Domain Specific Language)
基本语法
GET /_search
{
"query": <query clause>
}
查询分类
- 根据目的分类
- 上下文查询(Query context),简称查询
在上下文查询语境中,查询语句会询问文档与查询语句的匹配程度,此外,它会判断文档是否匹配并计算相关性评分(_score)的值。 - 上下文过滤(Filter context),简称过滤
在上下文过滤语境中,查询语句主要解决文档是否匹配的问题,而不会在意匹配程度(相关性评分)。过滤主要用于结构化的数据。
- 上下文查询(Query context),简称查询
- 根据查询语句分类
叶子查询语句 : 用于查询特殊字段的特殊值,例如:match, term, range 等。
复合查询语句 : 可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑。
查询语法
1. 全文查询
GET /_search
{
"query" : {
"match" : {
"full_name" : "John Smith"
},
"multi_match": {
"query": "John Smith",
"fields": ["first_name", "full_name"]
}
}
}
- match: 查询可操作文本、数值和日期类型的数据,分析它们并构建查询语句。
- match_phrase: 即短语(词组)匹配,它会分析提供的查询文本并构建一个 phrase 查询。
- match_phrase_prefix: 和 match_phrase 类似,但 match_phrase_prefix 不是精准匹配,而是前缀匹配,它会对查询文本的最后一个字符后的内容进行通配符搜索。
- multi_match: 用于多字段匹配查询。
2. Term-level 查询
Term-level 查询是直接查询倒排索引中的确切的值。
Term-level 查询通常用于结构化的数据,如数值、日期、枚举值或关键字,而不是文本(text)
POST /_search
{
"query": {
"term" : { "first_name" : "john" } ,
"terms" : { "full_name" : ["john", "john2"] },
"range" : {
"info.age" : {
"gte" : 28,
"lt" : 60,
"boost" : 2.0
}
},
"wildcard" : { "full_name" : "john*" },
"regexp" : { "full_name" : "jo.*" },
"type" : {
"value" : "user"
}
}
}
- term 用于查询指定字段的倒排索引包含某个确切值的记录。
- terms 和 term 类似,只不过提供的确切的值是数组。类似于 MySQL 的 in 条件。
- range 用于范围查询。
- exists 返回字段值不为 null 的记录。
- prefix 返回字段的 term 以确切的前缀(前缀不会被分析)开头的记录。
- wildcard 指的是通配符查询。支持的通配符主要有:(* 匹配 0 个或多个任意字符, ? 匹配 1 个任意字符)
- regexp 指的是正则查询。
- fuzzy 指的是容差查询,即可以容忍确切的值和倒排索引中的 term 之间有误差。
- type 查询指的是根据文档的 type 来查询。
- ids 查询指的是根据文档的 id 来查询。
3. 复合查询
GET /_search
{
"query": {
"constant_score" : {
"filter" : {
"term" : { "full_name" : "john"}
},
"boost" : 1.5
}
}
}
- constant_score 复合查询只会在过滤上下文中执行查询语句,并且返回的所有的记录的 _score 值是一个常量。
- bool 复合查询用于组合叶子查询语句或复合查询语句。如:must, should, must_not, or filter。
- must 必须匹配。
- should 至少匹配一个文档。
- filter 必须匹配,忽略相关性评分。
- must_not 必须不匹配,忽略相关性评分。
- 说明: must 和 should 在查询上下文中执行;must_not 和 filter 在过滤上下文中执行。
POST /_search
{
"query": {
"bool" : {
"must" : {
"term" : { "last_name" : "smith" }
},
"filter": {
"term" : { "info.interests" : "musics" }
},
"must_not" : {
"range" : {
"info.age" : { "gte" : 10, "lte" : 25 }
}
},
"should" : [
{ "term" : { "full_name" : "john" } },
{ "term" : { "full_name" : "smith" } }
],
"minimum_should_match" : 1,
"boost" : 2.0
}
}
参考:https://blog.csdn.net/lamp_yang_3533/article/details/97618687
网友评论