ES Query DSL
ES 查询使用Query DSL定义查询条件,除了精确查询Term外还包括以下查询:符合查询、文本查询、关联查询等结构
文本查询
Intervals 查询
区间查询:根据匹配项的顺序和接近度返回文档。
POST _search { "query": { "intervals" : { "my_text" : { "all_of" : { "ordered" : true, "intervals" : [ { "match" : { "query" : "my favorite food", "max_gaps" : 0, "ordered" : true } }, { "any_of" : { "intervals" : [ { "match" : { "query" : "hot water" } }, { "match" : { "query" : "cold porridge" } } ] } } ] } } } } } |
Intervals: {
“field”: {
“match”|”prefix”|”wildcard”|”fuzzy”|”any_of”|”all_of”:{}
}
}
Match文本匹配规则,查询对象包括以下属性:
query: 匹配文本呢
max_gaps: query匹配文本中术语的最大间隔, 默认是-1,表示不限制。 0则表示匹配文本必须严格相邻, 不允许出现间隔。
ordered: 可选,true则表示匹配术语必须按照query指定顺序
analyzer: 分词器
filter: interval filter可选过滤器。
use_field: 指定作用域。
prefix 规则参数
prefix: 匹配前缀
analyzer: 分词器
use_field: 指定作用域。
wildcard规则参数:
pattern: 匹配模式
analyzer: 分词器
use_field: 指定作用域。
fuzzy rule 参数
term: 匹配术语
prefix_length: 创建扩展时保持不变的起始字符数,默认是0
transpositions: 指示编辑是否包括两个相邻字符的换位
fuzziness: 允许匹配的最大编辑举例, 模糊度, 最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,就是2
analyzer: 分词器
use_field: 指定作用域。
all_of: 多个interval的匹配组合,全部
intervals: 组合中的intervals结构
max_gaps|ordered|fitler
any_of:多个interval的匹配组合,任意一个
intervals: 组合中的intervals结构
filter:过滤规则
filter:过滤规则
after: (可选,查询对象)—query的interval在filter的interval之后
before: (可选,规则对象)—query的interval在filter的interval之前
contained_by: (可选,查询对象)—filter中的interval包含query的interval
containing: (可选,查询对象)—query的interval包含filter的interval
not_contained_by: (可选,查询对象)—filter中的interval不包含query的interval
not_containing: (可选,查询对象)—query的interval不包含filter的interval
not_overlapping: (可选,查询对象)—filter中的interval与query的interval不重叠
overlapping: (可选,查询对象)—filter中的interval与query的interval相互重叠
script: (可选,脚本对象)—脚本用于返回匹配的文档
//以下查询包含filter规则,有两个限制条件: //1、要求desc字段查询时指定的query字段中两个词相隔不得超过3个位置(max_gaps) //2、在匹配词'distributed engine'之间不允许包含'redis'字段 POST software/_search { "query": { "intervals":{ "desc":{ "match":{ "query":"distributed engine", "max_gaps": 3, "filter":{ "not_containing":{ "match":{ "query": "redis" } } } } } } } } |
POST _search { "query": { "intervals" : { "my_text" : { "all_of" : { "intervals" : [ { "match" : { "query" : "the" } }, { "any_of" : { "intervals" : [ { "match" : { "query" : "big" } }, { "match" : { "query" : "big bad" } } ] } }, { "match" : { "query" : "wolf" } } ], "max_gaps" : 0, "ordered" : true } } } } } |
Match 查询
返回匹配的文档
GET /_search { "query": { "match": { "message": { "query": "this is a test" } } } } |
<field> : 指定匹配作用的域
<query>: 文本、数字、boolean或日期等期望在域中找到的值。Query查找不是精确查找,而是会使用文本分析后的token来进行匹配。
<analyzer>: 分析器, 不指定则使用文档域所指定的默认分析器。
auto_generate_synonyms_phrase_query: 可选, 如果设置为true则自动生成同义的上术语查询。
fuzziness: 模糊度,错误字符数
max_expansions: 查询延伸的最大术语个数, 默认是50
prefix_length:允许模糊匹配的最小前缀长度(该长度内字符不进行模糊匹配)默认是0.
fuzzy_transpositions: 模糊匹配是否匹配字符位置交换的情况
fuzzy_rewrite: 用于重写查询
lenient: 为true时, 格式相关的错误将被忽略, 如对一个数字域进行文本查询。默认是false
operator: query 查询术语之间的关系, 有OR , AND
minimum_should_match:指定match 应匹配的最小规则数量。
zero_terms_query:指定当analyzer移除所有tokens后的文档返回行文。 默认是none: 不返回文档。 all: 返回所有文档。
GET /_search { "query": { "match": { "message": { "query": "this is a test", "operator": "and" } } } } |
match_bool_prefix
分析查询输入,转换为多个术语的bool查询。
GET /_search { "query": { "match_bool_prefix" : { "message" : "quick brown f" } } } | GET /_search { "query": { "bool" : { "should": [ { "term": { "message": "quick" }}, { "term": { "message": "brown" }}, { "prefix": { "message": "f"}} ] } } } |
match_phrase
match_phrase是短语搜索,使用文本分析器分析给定的短语(phrase),转换短语为一个完整的查询条件,而不是进行文本分析后的match查询
GET /_search { "query": { "match_phrase": { "message": { "query": "this is a test", "analyzer": "my_analyzer" } } } } |
Match phrase prefix query
短语按照给定顺序,并且作为一个前缀进行匹配。
GET /_search { "query": { "match_phrase_prefix": { "message": { "query": "quick brown f" } } } } |
"match_phrase_prefix": {
“Field”: //匹配域
{
“query”:””,//查询短语,
“analyzer”:””//分析器, 转换query值
“max_expansions”:50,//最大的扩展术语扩展数量
“slop”:0,//匹配token之间最大的位置, 默认是0,
“zero_terms_query”: none|all,//当分析器移除所有token时的文档返回行为。
}
}
Combined fields
支持对对个文本域进行查询。
GET /_search { "query": { "combined_fields" : { "query": "database systems", "fields": [ "title", "abstract", "body"], "operator": "and" } } } |
query: 匹配文本
fileds: 作用的域
auto_generate_synonyms_phrase_query: true启动同义查询
operator:token 匹配行文 , or and
minimum_should_match|zero_terms_query: 同上文
combined fields和multi_match查询到区别:
combined fields: 针对多个文本域进行匹配, 要求具有同样的分析器。
multi_match:可以使用一个查询处理不同类型的域,如关键词, 数字等。
Multi-match query
构建针对多个域的match查询。
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" ] } } } |
best_fields: 使用best_fields指定域的_score
most_fields: 使用所有匹配域的分数合并为_score
cross_fields: 将使用相同分析器的多个域当成一个大域
phrase:在每一个域上执行一个match_phrase,使用最匹配的_score.
phrase_prefix: 类似phrase,执行phrase_prefix
bool_prefix: 在每个域上执行match_boolean_prefix。组合_score分数
GET /_search { "query": { "multi_match" : { "query": "brown fox", "type": "best_fields", "fields": [ "subject", "message" ], "tie_breaker": 0.3 } } } |
GET /_search { "query": { "multi_match" : { "query": "Will Smith", "type": "cross_fields", "fields": [ "first_name", "last_name" ], "operator": "and" } } } |
Query String
可以 AND , NOT 等关键词提供搜索语义。
GET /_search { "query": { "query_string": { "query": "(new york city) OR (big apple)", "default_field": "content" } } } |
query_string:
query: 查询语句
default_field:没有指定作用域时默认查询的域, 查询不会作用再嵌入域中, 嵌入域需要使用nested 查询。
default_operator: 当query语句中没有指定操作符时的默认操作符, OR(默认) , AND
fields: 查询的域
Query string query | Elasticsearch Guide [7.17] | Elastic 了解详细Query String 语法。
Simple Query String
和Query String的区别在于,对语法的限定, 当查询语法超出限定时,Simple Query String 忽略非法的语法。
GET /_search { "query": { "simple_query_string" : { "query": "\"fried eggs\" +(eggplant | potato) -frittata", "fields": ["title^5", "body"], "default_operator": "and" } } } |
query: 查询语句
fields: 查询域
default_operator: 默认逻辑操作符: OR(默认), AND
analyze_wildcard: true时,扩展通配符查询, flase不扩展 默认是false
auto_generate_synonyms_phrase_query: true-扩展统一查询,默认true
flags: 允许的操作符列表。
Simple query string 语法支持以下操作符:
+: AND
|: OR
-: NOT
“”: 引用符作为一个完整短语查询
*: 术语之后表示前缀查询
(): 运算优先级
~N: 在词之后表示一个模糊距离
~N:在短语之后表示Slot量
GET /_search { "query": { "simple_query_string": { "fields": [ "content" ], "query": "foo bar -baz" } } } |
flags限制可用操作符
GET /_search { "query": { "simple_query_string": { "query": "foo | bar + baz*", "flags": "OR|AND|PREFIX" } } } |
ALL: 默认 全部
AND: 使能AND
ESCAPE: 使能\作为escape字符
FUZZY:使能~N应用在词后面
NEAR:使能~N应用在短语后面
NONE:失效所有操作符
NOT:使能-
OR:使能\|
PHRASE: 使能””
PRECEDENCE:使能()
PREFIX:使能*
SLOP:同NEAR
WHITESPACE: 使能空格作为分隔符。