DSL语法
【摘要】 DSL(领域专用语言)是一种针对特定领域开发的语言,它的语法和特性通常根据该领域的特点进行定制,以提供更高效、更易于理解和使用的编程体验。DSL语法的使用场景包括但不限于以下几种:配置文件:DSL语法可以用于编写配置文件,以便于快速配置和定制软件或系统的行为。例如,Rails框架中的配置文件就是使用DSL语法编写的。数据转换:DSL语法可以用于定义数据之间的转换规则。例如,XML转换为JSO...
DSL(领域专用语言)是一种针对特定领域开发的语言,它的语法和特性通常根据该领域的特点进行定制,以提供更高效、更易于理解和使用的编程体验。
DSL语法的使用场景包括但不限于以下几种:
-
配置文件:DSL语法可以用于编写配置文件,以便于快速配置和定制软件或系统的行为。例如,Rails框架中的配置文件就是使用DSL语法编写的。
-
数据转换:DSL语法可以用于定义数据之间的转换规则。例如,XML转换为JSON、CSV转换为XML等。
-
测试和断言:DSL语法可以用于编写测试用例,以便于测试和验证代码的正确性。例如,RSpec和Cucumber都是使用DSL语法的测试框架。
-
领域建模:DSL语法可以用于描述和定义特定领域的模型和概念。例如,UML是一种DSL语法,用于建模软件系统的结构和行为。
-
领域驱动设计(DDD):DSL语法可以用于支持领域驱动设计的实现。例如,EventStorming工具使用DSL语法来帮助团队进行领域建模和事件溯源。
总的来说,DSL语法的使用场景主要是在需要简化和定制特定领域编程体验的情况下,可以提供更高效、更易于理解和使用的编程语言。
- 知识点是按照集数依次整理,方便日后回来查找。
- 考虑到不是固定的联网方式,时而WiFi,时而热点,配置静态IP会导致每次网络变更后都需要重新配置,所以虚拟机使用的动态路由,当需要运行相关程序时,IP变化,只需要修改测试时初始化的RestHighLevelClient即可。
- 将代码路径列举主要是为后续审查。
- RestClient操作索引库的代码路径
E:\微服务\实用篇\day05-Elasticsearch01\资料\hotel-demo
。
- DSL查询语法(P101)
- 查询所有:查询出所有数据,一般测试用。例如:
match_all
。 - 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
match
、multi_match
;两者区别match根据一个字段查询,multi_match根据多个字段查询;参与查询的字段越多,查询性能越差。 - 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
ids
、range
、term
; - 地理(geo)查询:根据经纬度查询。例如:
geo_distance
、geo_bounding_box
。 - 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
Boolean Query
、function_score
。 - 相关性打分算法(P105)
- TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
- BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平。
# 查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
# 全文检索 -- match查询(效率高)
GET /hotel/_search
{
"query": {
"match": {
"all": "外滩如家"
}
}
}
# 全文检索 -- multi_match
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand", "name", "business"]
}
}
}
# 精确查询 -- term查询
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}
# 精确查询 -- range查询 范围
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 300
}
}
}
}
# 地理查询 -- distance查询
GET /hotel/_search
{
"query": {
"geo_distance": {
"distance": "2km",
"location": "31.21, 121.5"
}
}
}
# 复合查询 -- function_score 参加打分
# 给“如家”这个品牌的酒店靠前一点
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"all": "外滩"
}
},
"functions": [ //算分函数
{
"filter": { //条件
"term": {
"brand": "如家"
}
},
"weight": 10 //算分权重
}
],
"boost_mode": "sum" //加权分式
}
}
}
# 复合查询 -- Boolean Query
# must:必须匹配的条件,可以理解为“与”
# should:选择性匹配的条件,可以理解为“或”
# must_not:必须不匹配的条件,不参与打分 - 提高效率
# filter:必须匹配的条件,不参与打分 - 提高效率
# 搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{"match":{"name": "如家"}}
],
"must_not": [
{"range":{"price":{"gt": 400}}}
],
"filter":[
{"geo_distance": {
"distance": "20km",
"location": {
"lat": 31.21,
"lon": 121.5
}
}}
]
}
}
}
- 搜索结果处理(P108)
- 排序 – 经过排序就不做相关性打分,提高查询效率。
- 分页–文档全部查询,然后截取当前文档的位置+显示的文档数;默认top10,查询更多修改参数-from、size。
- 深度分页问题–ES集群处理的时候,是将所有节点的结果聚合,在内存中排序,在选中相应的文档;搜索页数过深,或结果集(from+size)越大,对内存和CPU的消耗也越高。
- es设定结果集上限为10000。
- 分页方式(P109)
from + size
–优点:支持随机翻页;缺点:深度分页问题。场景:百度、谷歌、京东等的随机翻页搜索。after search
–优点:没有查询上限(单词查询的size不超过10000),缺点:只能向后逐页查询,不支持随机翻页。场景:没有随机翻页需求的搜索,例如手机向下翻页。scroll
:优点:没有查询上限(单词查询的size不超过10000),缺点:会额外消耗内存,搜索结果是非实时的,场景:海量数据的获取和迁移。(已弃用)- 高亮–将搜索结果中把搜索关键字突出显示。
# 对酒店数据按照用户评价降序排序,评价相同的按照价格升序排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"score": "desc"
},
{
"price": "asc"
}
]
}
# 对酒店数据数据按照你的位置坐标的距离升序排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 31.034661,
"lon": 121.612282
},
"order": "asc",
"unit": "km"
}
}
]
}
# 分页查询 -- from-分页当前的位置 size-显示文档的总数
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort":[
{
"price": "asc"
}
],
"from": 0,
"size": 10
}
# 高亮查询,默认情况下,ES搜索字段必须与高亮字段一致,可以将"require_field_match":"false"-关闭搜索字段和高亮字段匹配
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight":{
"fields":{
"name":{
"require_field_match":"false"
}
}
}
}
- RestClient查询文档–利用JavaRestClient查询文档。(P111)
- 基本步骤–创建SearchRequest对象-准备Request.source(),其中QueryBuilders来构建查询条件,再传入query()方法-发送请求,得到结果-解析结果(参考JSON结果,从外到内,逐层解析)。
- 全文检索 – 要构建条件只需要QueryBuilders。
- 高亮–高亮结果解析是参考JSON结果,逐层解析。
->微服务技术栈DSL语法课程视频
https://www.bilibili.com/video/BV1LQ4y127n4?p=100
<-
记录每一个学习瞬间
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)