ES查询语法
基本查询语法
1)查询所有
2)全文检索查询
match查询
对用户输入的内容分词后,根据某个字段进行倒排检索查询。越精确的数据越靠前。
Field:字段。
Text:查询内容
#全文检索查询match——示例
GET /hotel/_search
{
"query": {
"match": {
"all": "上海外滩如家"
}
}
}
multi_match查询
与match类似,多字段同时查询。
#全文检索查询multi_match——示例
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "上海外滩如家",
"fields": ["brand","name","business"]
}
}
}
3)精确查询
精确查询时,不会对查询条件进行分词处理,与MySQL条件查询等号匹配类似。
精确值查询
#精确查询term——示例
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}
范围查询
#精确查询range——示例
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100, #大于等于
"lte": 200 #小于等于
#"gt": 100, #大于
#"lt": 200 #小于
}
}
}
}
总结
4)地理查询
geo_bounding_box:geo_point值在某个矩形范围内的所有文档
geo_distance:距离某个点的所有文档
#地理查询:中心扩散查询(距离中心距离)geo_distance——示例
GET /hotel/_search
{
"query": {
"geo_distance": {
"distance": "5km",
"location": "31.21,121.5"
}
}
}
5)相关性算分(百度竞价)
Function Score Query:自定义文档数据排名。
#加权查询(百度竞价了属于是)functions_score
GET /hotel/_search
{
"query": {
"function_score": {
"query": { #普通查询数据
"match": {
"all": "外滩"
}
},
"functions": [#设置加权函数
{
"filter": {#过滤出需要加权的数据,这里过滤出“如家酒店”的数据
"term": {
"brand": "如家"
}
},
"weight": 10 #加权值
}
],
"boost_mode": "multiply" #加权方式
}
}
}
6)复合查询Boolean Query
must与filter区别:must算分,filter不算分。需要算分的查询条件放到must里,不需要算分的放大filter里。
#复合查询 Boolean Query
GET /hotel/_search
{
"query": {
"bool": {
"must": [ #必须匹配,并且参与算分
{
"match": {
"brand": "如家"
}
}
],
"must_not": [ #相反匹配,同“非”效果,不参与权重算分
{
"range": { #范围查询
"price": { #价格字段
"gt": 400 #大于400(取反后就是不大于400)
}
}
}
],
"filter": [ #必须匹配,不参与算分
{
"geo_distance": { #地理范围查询,不过按理说距离范围应该参与算分,距离越近的应该分数越高
"distance": "10km",#距离10千米以内
"location": { #坐标字段
"lat": 31.21, #纬度
"lon": 121.5 #经度
}
}
}
]
}
}
}
搜索结果处理(排序、分页、高亮)
1)排序
数字、日期排序
#数字、日期排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [ #查询结果排序
{
"price": { #排序字段
"order": "asc" #排序方式asc升序 desc倒序
}
}
]
}
地理位置排序
#地理位置排序,找到附近酒店,距离越近排名越靠前
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": { #地理位置排序
"location": { #排序字段
"lat": 31.034661, #你的纬度
"lon": 121.612282 ##你的经度
},
"order": "asc", #升序,距离越近排名越靠前
"unit": "km" #距离单位 km
}
}
]
}
#查询结果解析
{
"_index" : "hotel",
"_type" : "_doc",
"_id" : "2056298828",
"_score" : null,
"_source" : {
"address" : "沪南公路7688弄1号",
"brand" : "万豪",
"business" : "南汇/野生动物园",
"city" : "上海",
"id" : 2056298828,
"location" : "31.030053, 121.662943",
"name" : "上海中优城市万豪酒店",
"pic" : "https://m.tuniucdn.com/fb3/s1/2n9c/2gBATEyysyQWmw3wZL863HGdqjaq_w200_h200_c1_t0.jpg",
"price" : 1200,
"score" : 45,
"starName" : "五钻"
},
"sort" : [
4.8541199685347785 #距离自己位置的距离,单位为unit的km
]
}
PS:排序后文档就没有权重分数了
2)分页查询
分页查询最高只能查询10000条数,满足大部分业务。
#分页查询
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 0, #开始位置
"size": 10, #查询条数
"sort": [
{
"price": {
"order": "asc"
}
}
]
}
3)高亮
高亮:ES帮助我们添加标签,前端只需要对某个标签进行高亮处理即可
高亮的字段可以有多个,如:查询出的标题字段、内容字段。
#高亮查询——对查询关键字高亮显示
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": { #高亮查询
"fields": { #选择高亮字段
"name": {
"pre_tags": "<em>", #关键字前缀(默认就是em标签)
"post_tags": "</em>", #关键字后缀
"require_field_match": "false" #字段是否必须与查询字段一致才高亮,默认为true
}
}
}
}
#查询结果解析
{
"_index" : "hotel",
"_type" : "_doc",
"_id" : "339952837",
"_score" : 2.7571862,
"_source" : {
"address" : "良乡西路7号",
"brand" : "如家",
"business" : "房山风景区",
"city" : "北京",
"id" : 339952837,
"location" : "39.73167, 116.132482",
"name" : "如家酒店(北京良乡西路店)",
"pic" : "https://m.tuniucdn.com/fb3/s1/2n9c/3Dpgf5RTTzrxpeN5y3RLnRVtxMEA_w200_h200_c1_t0.jpg",
"price" : 159,
"score" : 46,
"starName" : "二钻"
},
"highlight" : { #高亮后,关键字会拼接前后缀,前段对em表现css设置高亮颜色即可
"name" : [
"<em>如家</em>酒店(北京良乡西路店)"
]
}
},