ElasticSearch(2)

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>酒店(北京良乡西路店)"
          ]
        }
      },

未完待续~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值