12.7 DSL查询语法
查询的基本语法
GET /indexName/_search { "query": { "查询类型": { "查询条件": "条件值" } } }
查询所有
GET /hotel/_search { "query": { "match_all": {} } }
12.7.1 全文检索查询
全文检索查询,会对用户搜索内容进行分词,常用于搜索框搜索
match查询,全文检索查询的一种,会对用户输入内容进行分词,然后去倒排索引库检索
# match查询 GET /hotel/_search { "query": { "match": { "all": "外滩如家" } } }
multi_match: 允许同时查询多个字段,查询字段越多,性能越差
# multi_match查询 GET /hotel/_search { "query": { "multi_match": { "query": "外滩如家", "fields": ["brand","name","business"] } } }
12.7.2 精确查询
一般是查找keyword 数值,日期,boolean类型,你不会对搜索条件分词
term: 根据词条精确查询
# 精确查询 GET /hotel/_search { "query": { "term": { "city": { "value": "上海" } } } }
range: 根据值的范围查询:
# 范围查询 GET /hotel/_search { "query": { "range": { "price": { "gte": 100, "lte": 300 } } } }
12.7.3 地理查询
geo_bounding_box查询 查询的是给定的两点形成的矩形区域内满足要求的文档
geo_distance 查询的是到指定中心点小于某个距离的文档值
# 地理查询geo_distance GET /hotel/_search { "query": { "geo_distance": { "distance": "15km", "location": "31.21 , 121.5" } } }
12.7.4 复合查询
12.7.4.1 Function Score 查询
function score : 相关性算分查询,控制文档排名
例 : 给如家品牌的酒店排名考前一点
GET /hotel/_search { "query": { "function_score": { "query": { "match": { "all": "外滩" } }, "functions": [ { "filter": { "term": { "brand": "如家" } }, "weight": 10 } ], "boost_mode": "sum" } } }
12.7.4.2 Boolean查询
布尔查询是一个或多个查询子句的集合, 子查询的组合方式有:
must : 必须匹配每个子选项 类似”与“
should : 选择性匹配 类似”或“
must_not: 必须不匹配 ,不参与算分 类似”非“
filter: 必须匹配, 不参与算分
例1:查询上海的皇冠假日或华美达酒店并且价格在500以上,并且得分不低于45分
GET /hotel/_search { "query": { "bool": { "must": [ {"term": {"city": "上海"}} ], "should": [ {"term": {"brand": "皇冠假日"}}, {"term": {"brand": "华美达"}} ], "must_not": [ {"range": {"price": {"lte": 500} }} ], "filter": [ {"range": {"score": {"gte": 45}}} ] } } }
例2: 查询名字包含如家 价格不高于400 坐标在31.21,121.5周围10km的酒店
GET /hotel/_search { "query": { "bool": { "must": [ { "match": { "brand": "如家" } } ], "must_not": [ { "range": {"price": {"gt": 400}} } ], "filter": [ { "geo_distance": { "distance": "10km", "location": {"lat": 31.21,"lon": 121.5} } } ] } } }
12.7.5 搜索结果处理
12.7.5.1 排序
默认根据先关度算分来排序,可以自定义: keyword类型,数值类型,地理坐标类型,日期类型
普通字段:
GET /hotel/_search { "query": { "match_all": {} }, "sort": [ { "FIELD": "desc" } ] }
地理位置距离排序:
GET /hotel/_search { "query":{ "match_all": {} }, "sort": [ { "geo_distance": { "FIELD": "经度,纬度", "order": "asc", "unit": "km" } } ] }
例1: 按用户评价排序酒店,评价相同的按价格排序
GET /hotel/_search { "query": { "match_all": {} }, "sort": [ { "score": "desc" }, { "price": "asc" } ] }
例2: 实现对酒店数据按自己的位置距离进行升序排序
GET /hotel/_search { "query": { "match_all": {} }, "sort": [ { "_geo_distance": { "location": { "lat": 31.034661, "lon": 121.612282 }, "order": "asc", "unit": "km" } } ] }
12.7.5.2 分页
# 分页查询 GET /hotel/_search { "query": { "match_all": {} }, "sort": [ { "price": "asc" } ], "from": 10, // 从第几条开始 "size": 10 // 每页多少条 from+size不能超过10000 }
12.7.5.3 高亮
# 高亮查询 默认情况下 ES搜索字段必须与高亮字段一致 GET /hotel/_search { "query": { "match": { "all": "如家" } }, "highlight": { "fields": { "name": { "require_field_match": "false", // 取消默认 改为不用与搜索字段一致 "pre_tags": "<em>", "post_tags": "</em>" } } } }