只用一个查询字符串,你就可以在一个、多个或者 _all 索引库(indices)和一个、多个或者所有types中查询:
在请求体中传入from和size可以进行分页
GET /index/type1,type2/_search
{
//from代表从第几条数据开始查询
"from": 30,
//size代表查询几条数据
"size": 10
}
// 所以上面表示查询 30~40的数据
所有记录的查询语句可以参考官方文档
{
// 分页
"from": 30,
// 每页显示
"size": 10
"query" : {
// 匹配满足
"match" : {
"tweet": "About Search"
}
// 布尔查询
// 注意,每个布尔条件下,每个检索条件都要用{
}包住,即 {
"match":{
xxx:xxx}}这样的形式
"bool": {
// 文档 必须 匹配这些条件才能被包含进来。
"must": [
{
"match": {
"email": "business opportunity" }},
// 满足在某个范围内
{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}},
// 满足一个确定值
{
"term": {
"age": 26 }},
{
"term": {
"class": "三年一班" }},
// 相当于 tag in [ "search", "full_text", "nosql" ]
{
"terms": {
"tag": [ "search", "full_text", "nosql" ] }},
// 相当于 "title"或"body"中含有"full text search"
{
"multi_match": {
"query": "full text search",
"fields": [ "title", "body" ]
}}
],
// should 下的条件不需要全部满足,默认情况下只需要满足 should 下的一个条件即可,
"should": [
{
"match": {
"starred": true }},
{
"bool": {
"must": {
"match": {
"folder": "inbox" }},
"must_not": {
"match": {
"spam": true }}
}}
],
// 也可以通过 minimum_should_match 参数来改变需要满足的个数,满足的 should 条件越多,对应的文档的打分就越高,打分高的文档排序会靠前。
"minimum_should_match": 1
// 文档 必须不 匹配这些条件才能被包含进来。
"must_not" : {
}
// 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档
// 简答来说就是过滤文档,但不记录评分
"filter" : {
}
}
}
// 排序,默认按照评分降序排序
"sort": [
{
"date": {
"order": "desc" }},
{
"_score": {
"order": "desc" }}
]
}
ps:must类似于sql的and,must_not类似于not,should类似于or
此时不能直接进行properties.name的形式进行查询,需要再包一层例如
GET /_search
{
"query" : {
"bool" : {
"filter" : {
// 注意这里使用{
}包起来了,key是0而不是nested
{
"nested" : {
"path" : "properties",
"query" : {
// 注意这里也使用{
}包起来了,key是0而不是term
{
"term" : {
"properties.name" : "第一次"
}}
}
}},
// 注意这里使用{
}包起来了,key是1而不是nested
{
"nested" : {
"path" : "properties",
"query" : {
{
"term" : {
"properties.name" : "第二次"
}}
}
}},
// 注意这里使用{
}包起来了,key是2而不是nested
{
"nested" : {
"path" : "properties",
"query" : {
{
"term" : {
"properties.name" : "第三次"
}}
}
}},
}
}
}
}
{
"properties" : {
// 此处的是字段名
"properties" : {
"type" : "nested",
"properties" : {
"name" : {
"type" : "keyword"},
"value" : {
"type" : "keyword"},
}
}
}
}
此时,如果有这样的数据
A产品属性
name | value |
---|---|
个数 | 1 |
重量 | 2 |
B产品属性
name | value |
---|---|
个数 | 2 |
重量 | 1 |
当筛选条件是
name = 个数
value = 1
结果两个产品都会出现,而不是只有A产品
这是因为对于nested下的数据,Elasticsearch 在存储多个值时会将值聚合,
类似于这样的结构
name = [个数,重量]
value = [1,2]
导致不管搜什么都是符合的
常用查询可以参考