Elasticsearch 提供了一个完整的基于 JSON 的查询 DSL(Domain Specific Language)来定义查询
参考:Query DSL | Elasticsearch Guide [8.0] | Elastic
一个查询语句可由叶子查询子句(Leaf Query Clauses)和 复合查询子句(Compound Query Clauses)两部分构成
在指定的字段上查询指定的值,如 match、term、range 等,子句可以单独使用
包装其他叶子查询或复合查询为一个查询,并用于以逻辑方式组合多个查询或改变它们的行为
Elasticsearch查询子句的行为,取决于它们是在查询上下文(Query Context)中还是在过滤上下文(Filter Context)中运行
参考:Query and filter context | Elasticsearch Guide [8.0] | Elastic
查询上下文
在查询上下文中,查询子句回答 “这个文档有多匹配这个查询?”。除了决定文档是否匹配,字句匹配的文档还会计算一个字句评分,来评定文档有多匹配。查询上下文由 query 元素表示
过滤上下文
在过滤上下文中,过滤子句回答 “这个文档是否匹配这个查询?”。过滤上下文主要用于过滤结构化数据,不参与相关性评分,但被频繁使用的Filter将被缓存以提高查询性能。过滤上下文由 例如 bool 查询中的 filter 或 must_not 表示
字段类查询主要包括两类:单词匹配(Term Level Query)和全文匹配(Full Text Query)
单词匹配
不对查询语句进行分词处理,直接匹配该字段的倒排索引;包括 term、terms、range 等查询语句
全文匹配
对查询语句进行分词处理候再去匹配已分词的文本字段。包括 match、match_phrase、query_string 查询语句
term
根据精确的值(比如ID、UserName)来检索文档;不会对查询条件做分词处理;如果检索字段会分词且查询条件可分词时则查询不到结果
GET /goods/_search
{
"query": {
"term": {
"name": "苹果"
}
}
}
terms
terms和term 有点类似,但 terms 允许指定多个匹配条件
GET /goods/_search
{
"query": {
"terms": {
"name": [ "苹果", "华为" ]
}
}
}
range
范围查询主要用于date或number类型的字段查询。gt :大于;gte : 大于等于;lt :小于;lte : 小于等于
GET /goods/_search
{
"query": {
"range": {
"price": {
"gte": 5000,
"lte": 9000
}
}
}
}
exists
查询指定字段值不为空的文档
GET /goods/_search
{
"query": {
"exists" : { "field" : "gift" }
}
}
fuzzy
查询与指定字段值与搜索词类似(由Levenshtein编辑距离度量)的词的文档
GET /goods/_search
{
"query": {
"fuzzy": {
"keywords": {
// 搜索 wetch 可将 watch 返回
"value": "wetch"
}
}
}
}
wildcard
查询与指定字段值与与通配符相匹配的词的文档
注意分词模式,对分词字段是正对分词后的词组进行匹配
应劲量避免使用通配符最为前缀,否则会增加匹配的迭代次数并降低搜索的性能
支持的通配符运算符:
? :它与任何单个字符匹配
* :可以匹配零个或多个字符
GET /goods/_search
{
"query": {
"wildcard": {
"goodsName": {
// 前后不固定长度和字符的匹配
"value": "*淇*"
}
}
}
}
regexp
查询与指定字段值与正则表达式相匹配的词的文档
注意分词模式,对分词字段是正对分词后的词组进行匹配
支持以下标准运算符:
. :匹配任何字符
? :重复前面的字符零或一遍
+ :重复前面的字符一次或多次
* :重复前面的字符零次或多次
{} :前一个字符可以重复的最小和最大次数
| :或运算符,如果左侧或右侧的最长模式匹配,则匹配成功
( … ) :构建一个小组,可以使用组将表达式的一部分视为单个字符
[ … ] :匹配括号中的一个字符
GET /goods/_search
{
"query": {
"regexp": {
"goodsName": {
// 前后不固定长度和字符的匹配
"value": ".*果.*"
}
}
}
}
match
用于执行全文检索的字段类查询的基础查询
GET /goods/_search
{
"query": {
"match": {
"name": "苹果手机"
}
}
}
match_phrase
用于对短语进行全文检索,可以设置短语单词间允许的间隔个数,默认无间隔
GET /goods/_search
{
"query": {
"match_phrase": {
"name": "苹果公司"
}
}
}
---------------------------------------
GET /goods/_search
{
"query": {
"match_phrase": {
"name": {
"query": "苹果公司",
"slop":5
}
}
}
}
multi_match
用于多字段进行全文检索,其中一个字段满足即可被检索
GET /goods/_search
{
"query": {
"multi_match": {
"query" : "苹果",
"fields" : ["name", "content"]
}
}
}
query_string
用于构建复杂的全文检索,包括通配符、跨字段等的搜索
GET /goods/_search
{
"query": {
"query_string": {
"default_field": "name",
"query": "苹果 or Apple"
}
}
}
--------------------------------
GET /goods/_search
{
"query": {
"query_string": {
"fields": ["name","content"],
"query": "苹果 or Apple"
}
}
}
包括 bool query、boosting query、constant_score query、dis_max query、funcation_score query 等
Bool Query 是检索与多个查询经过布尔逻辑后相匹配的文档的查询,由一个或多个 bool 子句构成的
关键字 | 描述 |
must | 返回的结果文档必须完全匹配子句的查询条件,并将对分数产生影响 |
filter | 返回的结果文档必须完全匹配子句的查询条件,在Filter上下文中执行,不对分数产生影响 |
should | 返回的结果文档最好匹配子句的查询条件,对分数产生影响 |
must_not | 返回的结果文档必须不匹配子句的查询条件,在Filter上下文中执行,不对分数产生影响 |
must、must_not 语句里面如果包含多个条件,则各个条件间是 且 的关系,而 should 的多个条件是 或 的关系
查询语句同时包含 must 和 should 时,可以不满足 should 的条件;只包含 should 时必须满足
GET /goods/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "苹果"
}
}
],
"should": [
{
"term": {
"price": 8999
}
}
]
}
}
}