DSL查询分类(常用)
-
查询所有:查询所有数据,一般用于测试。如:match_all
// 查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
-
全文检索查询:利用分词器对用户输入内容分词,在倒排索引库中进行匹配
// match查询: 根据一个字段查询
GET /hotel/_search
{
"query": {
"match": {
"brand": "如家"
}
}
}
// multi_match 查询:根据多个字段查询,参与查询的字段越多,性能越差
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand","name","business"]
}
}
}
-
精确查询:一般查找keyword、数值、日期、boolean等类型字段
// range查询(范围查询:价格,日期等)
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 200,
"lte": 1000
}
}
}
}
// term查询(精确查询,输入值必须与词条内容保持一致)
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}
-
地理查询:根据经纬度查询
// distance 查询
GET /hotel/_search
{
"query": {
"geo_distance": {
"distance": "2km", // 半径画圆,圆内的所有数据都符合
"location": "31.21,121.5" // 中心点坐标
}
}
}
// geo_bounding_box 查询(形成矩形区域范围内的数据)
GET /hotel/_search
{
"query": {
"geo_bounding_box":{
"location": {
"top_left":{ // 矩形左上角定点
"lat": 31.1,
"lon": 121.5
},
"bottom_right": { // 矩形右下角定点
"lat":30.9,
"lon":121.7
}
}
}
}
}
-
DSL查询语法---相关性算分
- 过滤条件:哪些文档要加分
- 算分函数:如何计算function score
- 加权方式:function score 与 query score如何运算
-
复合查询:将上述各种查询条件组合起来,合并查询条件
// function score 查询
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"name": "外滩" // 这里查询到的得分为:相关性得分
}
},
"functions": [
{
"filter": {
"term": {
"brand": "如家" // 过滤条件,如家品牌的得分会加10
}
},
"weight": 10 // 函数结果分
}
],
"boost_mode": "sum" // 加分模式为求和,相关性得分加函数结果分
}
}
}
bool查询的四种逻辑关系
- must:必须匹配的条件,有逻辑 "与" 的意思
- should:选择性匹配的条件,有逻辑 "或" 的意思
- must_not :必须不匹配的条件,有逻辑 "非" 的意思 (不参与打分)
- filter:必须匹配的条件 (不参与打分)
// bool 查询
// 搜索名字包含 "如家",价格小于等于400,在坐标31.21,121.5 周围10KM范围内的酒店
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "如家"
}
}
],
"must_not": [
{
"range": {
"price": {
"gt": 400
}
}
}
],
"filter": [
{
"geo_distance": {
"distance": "10km",
"location": {
"lat": 31.21,
"lon": 121.5
}
}
}
]
}
}
}
对搜索结果的操作
排序
概述:支持排序的字段有(keyword,数值类型,日期类型,地理坐标类型)
// keyword,数值,日期等
// 对评分进行降序,评分相同情况下再满足价格升序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"score": "desc"
},
{
"price": "asc"
}
]
}
// 地理坐标排序
// 找到某个经纬度周围的就点,距离升序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 31, // lat代表纬度
"lon": 121.6 // lon代表经度
},
"order": "asc",
"unit": "km"
}
}
]
}
分页
elasticsearch 默认情况下只返回TOP10的数据,要查询更多数据需要修改分页参数
- from + size :支持随机翻页,深度分页问题,默认查询上限:10000(常用)
- after search:没有查询上限(单次查询不超过10000),只能向后逐页查询,不支持随机翻页,可用场景:手机向下滚动翻页
- scroll:弃用,会消耗额外的内存,搜索结果非实时
// 分页查询
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 0, // 分页起点
"size": 10, // 分页大小
"sort": [
{
"price": "asc"
}
]
}
高亮显示
// 高亮查询,默认情况下,查询字段必须与高亮字段保持一致
GET /hotel/_search
{
"query": {
"match": {
"name": "如家"
}
},
"highlight": {
"fields": {
"name": {
"require_field_match": "false" // 这里将需不需要字段匹配设置为false
}
}
}
}
在实际开发的应用(去看具体案例,hotel-demo)
// 算分控制,广告置顶
FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
boolQuery,
// function score 数组
new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
// 其中的一个function score 元素
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
// 过滤条件
QueryBuilders.termQuery("isAD",true),
ScoreFunctionBuilders.weightFactorFunction(10)
)
});
本文介绍了DSL查询语法,包括全文检索、精确查询、地理查询和复合查询等,详细讲解了bool查询的四种逻辑关系:must、should、must_not和filter。还讨论了如何对搜索结果进行排序、分页和高亮显示,并提到了在实际开发中的应用案例——hotel-demo。
3562

被折叠的 条评论
为什么被折叠?



