DSL查询语法

本文介绍了DSL查询语法,包括全文检索、精确查询、地理查询和复合查询等,详细讲解了bool查询的四种逻辑关系:must、should、must_not和filter。还讨论了如何对搜索结果进行排序、分页和高亮显示,并提到了在实际开发中的应用案例——hotel-demo。

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查询语法---相关性算分

  1. 过滤条件:哪些文档要加分
  2. 算分函数:如何计算function score
  3. 加权方式: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)
        )
    });

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值