elasticsearch 版本是7.7.0验证
一 、过滤查询
包含 term,terms ,match,multi_match,range,bool,exists,
1、term过滤
term主要用于精确匹配哪些值,比如数字,日期布尔值或not_analyzed的字符串(未经分析的文本数据类型):
POST text_index/_search
{"query":{"term":{"type_id":57}}}
POST test_index/_search
{"query":{ "term" : { "date" : "2014-09-01"}}}
# 注意这些句子是在kibana 中执行。其次 test_index是索引名
2、terms过滤
terms跟term有点类似,但terms允许指定多个匹配条件。如果某个字段指定了多个值,那么文档需要一起去做匹配:
POST test_index/_search
{"query":{"terms" : {"tag" : { "search" , "full_text" , "nosql" }}}}
3、range过滤
range过滤允许我们按照指定范围查找一批数据
{
"range" : {
"age" : {
"gte" : 20,
"lt" :30
}
}
}
范围操作符包含:
gt → 大于 gte → 大于等于
lt → 小于 lte → 小于等于
4、exists和missing过滤
exists和missing过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件
{"exists" : {"field" : "title"}}
这两个过滤只是针对已经查询一批数据来,但是想区分出某个字段是否存在的时候使用。
es7.7.0版本没有missing关键字了。
5、bool过滤
bool过滤可以用来合并多个过滤条件查询结果布尔逻辑,它包括一个操作符:
must 多个查询条件的完全匹配,相当于and。
must_not 多个查询条件的相反匹配,相当于not。
should 至少有一个查询条件匹配,相当于or。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:
{
"bool" : {
"must" : { "term" : { "folder" : "inbox" } } ,
"must_not" : { "term" : { "folder" : "index" } },
"should" : [
{ "term" : { "term" : { "starred" : true } } },
{ "term" : { "term" : { "unread" : true } } } ]
}
}
6、match_all查询
使用match_all可以查询到所有文档,是没有查询条件下的默认语句。
{
"match_all" : {}
}
此查询常用于合并过滤条件。比如说你需要检索所有的邮箱,所有的文档相关性都是相同的,所以得到的_source为1
7、match查询
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用match查询一个全文本字段,它会在真正查询之前用分析器先分析一下查询字符:
{
"match" : {
"tweet" : "About Search"
}
}
注意:如果用match下制定了一个确切值,在遇到数字、日期、布尔值或者not_analyzed的字符串时,它将为你搜索你给定的值:
{ "match" : { "age" : 26 } }
{ "match" : { "date" : "2014-09-01" } }
8、multi_match查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,通俗的讲,就是在多个字段中查询你的文本:
{
"multi_match" : {
"query" : "full text search",
"fields" : [ "title" , "body" ]
}
}
二 、查询与过滤条件的合并
查询语句和过滤语句可以放在各自的上下文中。在Elasticsearch API中我们会看到许多带有query或filter的语句。这些语句既可以包含单条query语句,也可以包含一条filter子句。换句话说,这些语句需要首先创建一个query或filter的上下文关系。
复合查询语句可以加入其它查询子句,复合过滤子句也可以加入其它过滤子句。通常情况下,一条查询语句需要过滤语句的辅助,全文本搜索除外。
所以说,查询语句可以包含过滤子句,反之亦然,以便于我们切换query或filter的上下文。这就要求我们在读懂需求的同事构造正确有效的语句。
注意:search API中只能包含 query 语句,所以我们需要用 filtered 来同时包含 "query" 和 "filter" 子句,我们在外层再加入 query 的上下文关系
POST speech_index/_search
{"query":{"bool":{"filter":{"match":{"type_id":57}}}}}