一、es的dsl结构化查询,可以分为query和filter,他们之间的区别是:
query会计算分数值来查询,而filter不计算分数值。专业点的说法就是,query查询到的文档,会检查与查询条件的匹配度如何,filter查询到的文档,只是检查是否与查询匹配。正常情况下,filter的性能是强于query的。
在es1.X的时候,query跟filter是分开的,即存在:query:{} 跟 filter:{},在2.x包括2.x之后,所有的查询子句都包含在query里面,包括filter,类似:
{
"query": {
"bool": {
"should": [{
"match": {
"t_ds_events_repository|name": "订单"
}
}],
"filter": [
{
"term": { "t_ds_events_repository|status": 1}
},
{
"term": { "t_ds_events_repository|driver_type": 1}
}
],
"must": [{
"match": {
"t_ds_events_repository|name": "订单"
}
}]
}
}
}
二、query节点下,可以加bool,加与不加的区别是:
加:bool节点下的条件必须全部满足,相当于sql中的and
不加:query下的查询条件只要有一个满足,就能查询出来,相当于sql中的or
三、term和match的区别
term:对查询条件不分词
match:对查询条件分词