- 查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
- 全文检索查询
推荐使用上面这种 因为我把所查询的字段copy到了一个字段all里面,
只需要查询一个字段即可
GET /hotel/_search
{
"query": {
"match": {
"all": "外滩如家"
}
}
}
# 这两个效果一样
# 查询的字段越多,性能越差
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "如家",
"fields": ["brand","name","business"]
}
}
}
- 精确查询
必须符合条件的才被查询出来
# brand字段必须为如家的才能被查询出来
GET /hotel/_search
{
"query": {
"term": {
"brand": {
"value": "如家"
}
}
}
}
# 范围查找 gt是大于 gte是大于等于 lte和le也是一样
# 可以是数值也可以是日期
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gt": 249,
"lte": 3000
}
}
}
}
- 地理查询
GET /hotel/_search
{
"query": {
"geo_distance":{
# 表示附近距离
"distance":"5km",
# 这个地址的经纬度 的5km范围内
"location":"31.21,121.5"
}
}
}
FunctionScoreQuery
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
// 搜索如家的品牌
"brand": "如家"
}
},
"functions": [
{
// 筛选出品牌为如家的
"filter": {"term": {"brand": "如家"}},
// 并且加权重
"weight": 10
}
],
// 以相加的方式
"boost_mode": "sum"
}
}
}
复合查询 Boolean Query
布尔查询是一个或者多个查询子句的组合。子查询的组合方式有:
- must : 必须匹配每个子查询,类似与&&
- should:选择性匹配子查询,类似或||
- must_not :必须不匹配,不参与算分,类似 非 !
- fukter: 必须匹配与must相似,但不参与算分
在复合查询中除了要收拾
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": {
"value": "如家"
}
}
}
],
"must_not": [
{
"range": {
"price": {
"gte": 400
}
}}
],
"filter": [
{"geo_distance": {
"distance": "10km",
"location": {
"lat": 31.21,
"lon": 121.5
}
}}
]
}
}
}
排序
一但排序就没有打分
GET /hotel/_search
# 评分按降序 如果评分相同就按价格升序
{
"query": {
"match_all": {}
},
"sort": [
{
"score": {
"order": "desc"
}
,
"price": {
"order": "asc"
}
}
]
}
# 地理排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
# 坐标位置
"location": {
"lat": 31.034661,
"lon": 121.612282
},
"order": "asc", # 升序排序
"unit": "km" # 单位km
}
}
]
分页
高亮
# 默认就是高亮就是em标签如果想要其他的标签可以写pre 和 post
# 默认情况下 高亮的字段要和检索的字段名一致 如果不需要这个规则可以修改
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {
"fields": {
"name": {
"pre_tags": "<em>",
"post_tags": "</em>",
"require_field_match": "false"
}
}
}
}
查询出来的结果