搜索: 结构化查询(Query DSL)和结构化过滤(Filter DSL)(过滤查询已被弃用,并在ES 5.0中删除)
- term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed(如果想要不被分词就把数据类型设置为keyword)的字符串(未经分析的文本数据类型)
- terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配
- range过滤允许我们按照指定范围查找一批数据
- exists过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件(missing也已经启用,可以通过must_not,exists来实现空的条件)
- bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:
must :: 多个查询条件的完全匹配,相当于 and。
must_not :: 多个查询条件的相反匹配,相当于 not。
should :: 至少有一个查询条件匹配, 相当于 or。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组 - 使用match_all 可以查询到所有文档,是没有查询条件下的默认语句。
- match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符.
- multi_match查询允许你做match查询的基础上同时搜索多个字段
- match_phrase 短语匹配查询,match_phrase_prefix短语前缀匹配
测试用例
{
"query":{
"bool":{
"must":[
{
"exists":{
"field":"age"
}
},
{
"multi_match":{
"query":"唐宋八大家",
"fields":["name","description"]
}
}
],
"should":[
{"match":{"name":"商隐"}},
{"match":{"age":100}},
{
"bool":{
"must":{
"match":{
"birthdate":1998
}
}
}
},
{"term":{"age":983}},
{
"range":{
"age":{
"gte":100,
"lte":1000
}
}
}
]
}
},
"from":0,
"size":10,
"sort": [
{ "birthdate": { "order": "desc" }},
{ "_score": { "order": "desc" }}
],
"highlight":{
"pre_tags": ["<p>"],
"post_tags": ["</p>"],
"fields":{
"description":{}
}
}
}