文章目录
前言
以我的大学课设为例子,总结一下自己在做项目时,怎么使用es的查询功能。
插入数据示例
[
{
"courseDetailUrl": "https://www.icourse163.org/course/BUAA-89007",
"courseName": "航空航天概论",
"courseCoverUrl": "https://img-ph-mirror.nosdn.127.net/nIfa0p6KY_OYswDbNogLGA==/1458603329415573314.png",
"courseIsFree": 1,
"courseApplicant": 8472,
"courseGraderNum": 304,
"courseScore": 4.8,
"courseIntroduction": "\n 航空航天是人类拓展和探索大气层及宇宙空间的产物,代表着最先进的科学技术领域。航空航天概论主要讲述了航空航天基本概念、航空航天发展概况、飞行器的飞行原理、动力系统、构造及其机载设备等方面的基本知识、基本原理和常用技术。通过课程的学习,可以使学生对航空航天的基本知识和基本技术有一个比较全面的了解,同时也可以掌握航空航天技术的最新发展动态和发展趋势,是学生了解航空航天知识的重要窗口,也是培养学生对航空航天兴趣和爱好,激发学生热爱航空、献身航空的有效途径。\n",
"courseSyllabus": "\n\n第一周 航空航天发展概况第一周内容介绍第1讲 航空航天的概念、分类及作用第2讲 世界航空航天技术发展第3讲 中国航空航天技术发展第一周测试第二周 升力与阻力的产生第二周内容介绍第1讲 流体流动基本规律第2讲 飞机的升力第3讲 飞机的阻力第二周测试第三周 飞机气动布局及飞行性能第三周内容介绍第1讲 超声速飞行特点第2讲 飞机飞行性能第3讲 飞机操纵性与稳定性第三周测试第三周作业第四周 直升机飞行原理与航天器飞行原理第四周内容介绍第1讲 直升机的飞行第2讲 直升机的操纵第3讲 航天器飞行原理第四周测试第五周 航空器动力装置第五周内容介绍第1讲 活塞式发动机第2讲 涡轮喷气发动机第3讲 其他航空发动机第五周测试第五周作业第六周 航天器动力装置第六周内容介绍第1讲 液体火箭发动机第2讲 固体火箭发动机第3讲 非常规火箭发动机第六周测试第七周 飞行器导航与制导第七周内容介绍第1讲 导航与飞行控制第2讲 导弹的类型第3讲 导弹的制导第七周测试第八周 飞行器构造第八周内容介绍第1讲 飞机机体构造第2讲 飞机起落架第3讲 航天器构造第八周测试\n\n",
"School": {
"schoolLogoUrl": "https://img-ph-mirror.nosdn.127.net/Kv3j_azNQD8sFDvfqRFaHQ==/6597941679379294936.jpg",
"schoolName": "北京航空航天大学",
"schoolIntroduction": "https://www.icourse163.org/university/BUAA"
},
"Platform": {
"platformName": "中国大学mooc",
"platformIntroduction": "中国大学MOOC(慕课) 是国内优质的中文MOOC学习平台,由爱课程网携手网易云课堂打造。平台拥有包括985高校在内提供的千余门课程",
"platformIndexUrl": "https://www.icourse163.org/",
"platformId": "zgdxmk"
},
"Semester": [
{
"semesterStartTime": "2020-02-17",
"semesterEndTime": "2020-06-30",
"semesterStatus": 2,
"semesterReference": "https://www.icourse163.org/course/BUAA-89007/info",
"Teacher": [
{
"teacherName": "杨超",
"teacherPhotoUrl": "https://img-ph-mirror.nosdn.127.net/CZp5VCnhU9UljP8Vo_FuLw==/776870935821684376.jpg",
"teacherIntroduction": "教授,课程负责人"
},
{
"teacherName": "贾玉红",
"teacherPhotoUrl": "https://img-ph-mirror.nosdn.127.net/OMT9wW0HT5pHML_OTdsVJw==/1940488489543555909.jpg",
"teacherIntroduction": "教授,课程负责人"
},
{
"teacherName": "吴永康",
"teacherPhotoUrl": "https://img-ph-mirror.nosdn.127.net/wssozG8qHFe6R9mTYlxSrA==/6597351241635531066.jpg",
"teacherIntroduction": "副教授"
}
],
"semesterNo": 1
}
],
"courseId": "course_10001",
"courseCategory": [
"工学",
"国家精品"
]
},
{
"courseDetailUrl": "https://www.icourse163.org/course/DLMU-1001979017",
"courseName": "海上货物运输",
"courseCoverUrl": "https://edu-image.nosdn.127.net/02666AE0F5AD673B5AD883066FDA814B.jpg?imageView&thumbnail=426y240&quality=100",
"courseIsFree": 1,
"courseApplicant": 2159,
"courseGraderNum": 85,
"courseScore": 4.9,
"courseIntroduction": "\n海上货物运输是以船舶为载运工具,以货物为运输对象,通过海路,安全、优质、快速、经济地从始发港运达目的港的行为。《海上货物运输》课程是利用船舶静力学、材料力学、海运货物学、海运法规等知识研究各类海上运输货物的海运特性、各类运输船舶的货运性能、对货物在整个运输过程中的各个环节进行安全操作、有效管理的一门应用学科。其中货物主要包括普通杂货、特殊杂货、固体散货、液体散货、集装化货物,运输环节包括货物受载、配载、装载、积载、运载、卸载。课程的目的和任务是让学生掌握在海上货物运输过程中保证船舶、货物、人员、环境安全、货物完整及提高经济效益的基本原则,培养学生预防事故、正确面对事故和处理事故的能力。\n",
"courseSyllabus": "\n\n第一章 海运船舶与货物1.1 船舶基础知识1.2 船舶载货能力1.3 船舶性能介绍1.4 货物基础知识海运船舶与货物第一章章测试第二章 包装危险货物运输2.1 包装危险货物分类及危险性2.2 危险货物包装2.3 危险货物标志2.4 危险货物积载2.5 危险货物隔离2.6 国际海运危险货物规则包装危险货物运输第二章章测试第三章 普通杂货运输3.1 杂货分类及特性3.2 杂货船分类及结构特点3.3 普通杂货配装要求3.4 杂货船配载图编制3.5 普通杂货安全装运普通杂货运输第三章 章测试第四章 固体散货运输4.1 固体散货分类及特性4.2 固体散货船分类及结构特点4.3 固体散货装载计划编制4.4 固体散货安全装运4.5 水尺计重固体散货运输第四章 章测试第五章 散装谷物运输5.1 散装谷物海运特性5.2 散装谷物船结构特点及运输规则5.3 散装谷物配装5.4 散装谷物安全装运5.5 散装谷物船稳性核算散装谷物运输第五章章测试第六章 集装箱运输6.1 集装箱分类和标志6.2 集装箱船分类及结构特点6.3 集装箱船配装6.4 集装箱安全装运集装箱运输第六章 章测试第七章 特殊杂货运输7.1 货物单元积载与系固7.2 CSS规则7.3 重大件货物安全运输7.4 木材甲板货安全运输7.5 卷钢货物安全运输特殊杂货运输第七章 章测试第八章 液体散货运输8.1 石油安全运输8.2 石油计量8.3 散装化学品安全运输8.4 液化气体安全运输8.5 LNG安全运输液体散货运输第八章 章测试\n\n",
"School": {
"schoolLogoUrl": "https://img-ph-mirror.nosdn.127.net/EC0NQFDOLKHiBlNuAEKK_A==/6630699429303599547.png",
"schoolName": "大连海事大学",
"schoolIntroduction": "https://www.icourse163.org/university/DLMU"
},
"Platform": {
"platformName": "中国大学mooc",
"platformIntroduction": "中国大学MOOC(慕课) 是国内优质的中文MOOC学习平台,由爱课程网携手网易云课堂打造。平台拥有包括985高校在内提供的千余门课程",
"platformIndexUrl": "https://www.icourse163.org/",
"platformId": "zgdxmk"
},
"Semester": [
{
"semesterStartTime": "2020-03-02",
"semesterEndTime": "2020-06-30",
"semesterStatus": 2,
"semesterReference": "https://www.icourse163.org/course/DLMU-1001979017/info",
"Teacher": [
{
"teacherName": "田佰军",
"teacherPhotoUrl": "https://edu-image.nosdn.127.net/5AE9E42699C566441EBEFF43829319F2.JPG?imageView&thumbnail=180y180&quality=100",
"teacherIntroduction": "船长 副教授"
},
{
"teacherName": "王文新",
"teacherPhotoUrl": "https://edu-image.nosdn.127.net/D2559AFEDA5375DFEA5472B4FB8D646D.jpg?imageView&thumbnail=582y582&quality=100",
"teacherIntroduction": "副教授"
},
{
"teacherName": "姜华",
"teacherPhotoUrl": "https://edu-image.nosdn.127.net/AFB830FA8DC47BFB219352DDB5484FA8.jpg?imageView&thumbnail=582y582&quality=100",
"teacherIntroduction": "副教授"
}
],
"semesterNo": 1
}
],
"courseId": "course_10002",
"courseCategory": [
"工学",
"国家精品"
]
},
{
"courseDetailUrl": "https://www.icourse163.org/course/XZNU-1001754173",
"courseName": "中国古典诗文朗诵与吟诵",
"courseCoverUrl": "https://edu-image.nosdn.127.net/CDD4F37D1A7C19947B185CA159E8332E.jpg?imageView&thumbnail=510y288&quality=100",
"courseIsFree": 1,
"courseApplicant": 13302,
"courseGraderNum": 1118,
"courseScore": 4.8,
"courseIntroduction": "\n中国,是一个有着数千年文明的国度,一代又一代的人们将自己的心声凝结在诗文之中,使“中国心”成为一种延绵不断的永恒。汉语,是一种具有旋律感的有声语言,一代又一代的人们在诗文朗诵声中拥抱历史和感受当下,将过去、今天和未来华夏大地上的人们凝聚成“中国人”。本课程向你讲述中国诗文朗诵的历史传统,讲解朗诵古代各种文体的基本规则要领,解析和演示古诗文朗诵怎样把握作品的思想内涵和情感基调,怎样处理朗诵的音流节奏和语调语气,从而使古诗文朗诵既有古典风味又有现代审美品质。诗文吟诵,有两千多年传统,是一种独特的汉语声乐形态。近些年来,一度消歇的传统诗文吟诵逐步进入人们的视野,但仍然有不少人觉得传统吟诵既陌生又神秘。本课程向你讲述诗文吟诵的历史传统,展示全国各地老先生们有代表性的吟诵,讲解传统吟诵的基本规则,使你理解什么是真正的传统吟诵;传授古诗文吟诵的具体方法和操作要领,使你学会传统吟诵。古诗文吟诵,其实并不难,只要你有心学一学,进入本课程,你肯定能学会!同学们,传统吟诵之声,将来就靠你们传递下去呢!\n",
"courseSyllabus": "\n\n第一讲 中国汉语朗诵的传统和功能一、中国古代的诵读传统;二、古代诵读的功能。第一讲 中国汉语朗诵的传统和功能第二讲 古典诗文诵读的基本规则(上)一、古典诗文朗诵的语音;二、怎样处理古今音的差异; 三、古典诗文朗诵的“字声饱满”。第二讲 古典诗文诵读的基本规则(上)第三讲 古典诗文诵读的基本规则(下)一、古典诗文朗诵的“语流”;二、古典诗文朗诵的语调。第三讲 古典诗文诵读的基本规则(下)第四讲 诗意的表现:古典诗歌朗诵的要领(上)一、把握作品的主题和基本情调; 二、感受作品描绘的场景和意境; 三、体味作品的文学品位和人格气质。第四讲 诗意的表现:古典诗歌朗诵的要领(上)第五讲 诗意的表现:古典诗歌朗诵的要领(下)一、《蜀相》赏析及朗诵; 二、《将进酒》赏析及朗诵;三、《无题》赏析及朗诵;四、《游子吟》赏析及朗诵;五、《春江花月夜》赏析及朗诵。第五讲 诗意的表现:古典诗歌朗诵的要领(下)第六讲 《诗经》朗诵一、《诗经》介绍;二、《周颂·天作》赏析及朗诵; 三、《国风·关雎》赏析及朗诵;四、《魏风·伐檀》赏析及朗诵; 五、曹操《观沧海》赏析及朗诵。第六讲 《诗经》朗诵第七讲 楚辞朗诵一、楚辞介绍;二、《橘颂》赏析及朗诵; 三、《九歌·国殇》赏析及朗诵;四、《离骚》(节选)赏析及朗诵;五、刘邦《大风歌》赏析及朗诵;六、蔡琰《悲愤诗》赏析及朗诵。第七讲 楚辞朗诵第八讲 长篇叙事诗的朗诵一、叙事结构;二、叙事视角;三、叙事诗中的场景意境、人物形象、行为动作;四、《琵琶行》赏析及朗诵;五、《石壕吏》赏析及朗诵。第八讲 长篇叙事诗的朗诵第九讲 词体作品朗诵(上)一、词的结构与特点;二、柳永《雨霖铃》赏析及朗诵;三、周邦彦《虞美人》赏析及朗诵;四、陆游《钗头凤》赏析及朗诵;五、苏轼《江城子》赏析及朗诵;六、欧阳修《南歌子》赏析及朗诵。第九讲 词体作品朗诵(上)第十讲 词体作品朗诵(下)一、苏轼《念奴娇》赏析及朗诵;二、苏轼《水调歌头》赏析及朗诵;三、辛弃疾《破阵子》赏析及朗诵;四、辛弃疾《摸鱼儿》赏析及朗诵第十讲 词体作品朗诵(下)第十一讲 曲体作品朗诵一、曲体作品的特点; 二、关汉卿《四块玉》赏析及朗诵; 三、关汉卿《沉醉东风》赏析及朗诵; 四、马致远《夜行船》赏析及朗诵;五、乔吉《水仙子》赏析及朗诵;六、张可久《小桃红》赏析及朗诵第十一讲 曲体作品朗诵第十二讲 古典散文朗诵(上)一、散文的特征; 二、《论语》朗诵示例; 三、《孟子》朗诵示例;四、《庄子》朗诵示例;五、王勃《滕王阁序》(节选)赏析及朗诵; 六、刘禹锡《陋室铭》赏析及朗诵;七、杜牧《阿房宫赋》赏析及朗诵。第十二讲 古典散文朗诵(上)第十三讲 古典散文朗诵(下)一、范仲淹《岳阳楼记》赏析及朗诵;二、苏轼《赤壁赋》赏析及朗诵; 三、归有光《项脊轩志》赏析及朗诵。第十三讲 古典散文朗诵(下)第十四讲 传统的古典诗文吟诵及其当代价值(上)一、古代“吟”“诵”的含义;二、古代吟诵的特点;三、老先生的吟诵示例。第十四讲 传统的古典诗文吟诵及其当代价值(上)第十五讲 传统的古典诗文吟诵及其当代价值(下)一、对待传统吟诵的正确态度;二、全国各地老先生的吟诵示例。第十五讲 传统的古典诗文吟诵及其当代价值(下)第十六讲 传统古典诗文吟诵的基本规则与要领一、什么是传统的“吟诵调”;二、传统吟诵的第一规则:语步诵行; 三、传统吟诵的第二规则:吟腔的程式化与灵活性; 四、传统吟诵句格的几种形式;五、吟诵腔格。第十六讲 传统古典诗文吟诵的基本规则与要领第十七讲 绝句吟诗调与套调一、套调的运用;二、传统吟诵套调的两个注意点。第十七讲 绝句吟诗调与套调第十八讲 套调:不同诗体的吟诵(上)一、以绝套律;二、四言诗的套调吟诵。第十八讲 套调:不同诗体的吟诵(上)第十九讲 套调:不同诗体的吟诵(下)一、套吟《游子吟》;二、《将进酒》的吟诵示范。第十九讲 套调:不同诗体的吟诵(下)第二十讲 套调;词体的吟诵一、长短句的吟诵特点; 二、吟诵的“声情”与“词情”。第二十讲 套调;词体的吟诵\n\n",
"School": {
"schoolLogoUrl": "https://edu-image.nosdn.127.net/A53D3664B32C8E02EBEEE1BF4B40C7C3.png?imageView&thumbnail=220y80&quality=100",
"schoolName": "江苏师范大学",
"schoolIntroduction": "https://www.icourse163.org/university/XZNU"
},
"Platform": {
"platformName": "中国大学mooc",
"platformIntroduction": "中国大学MOOC(慕课) 是国内优质的中文MOOC学习平台,由爱课程网携手网易云课堂打造。平台拥有包括985高校在内提供的千余门课程",
"platformIndexUrl": "https://www.icourse163.org/",
"platformId": "zgdxmk"
},
"Semester": [
{
"semesterStartTime": "2020-02-17",
"semesterEndTime": "2020-06-15",
"semesterStatus": 3,
"semesterReference": "https://www.icourse163.org/course/XZNU-1001754173/info",
"Teacher": [
{
"teacherName": "李昌集",
"teacherPhotoUrl": "https://edu-image.nosdn.127.net/47A58DE84532B34F1433542E072B3012.jpg?imageView&thumbnail=180y180&quality=100",
"teacherIntroduction": "教授"
}
],
"semesterNo": 1
}
],
"courseId": "course_10003",
"courseCategory": [
"通识选修类",
"文学文化",
"国家精品"
]
}
]
一、关键字查询
最基础的查询语句,查询包括所输入关键字的字段,并且以source为返回结果,可以看到返回的查询结果还是较为让人满意的。
(为了在文档里展示方便,在查询语句中增加了一个参数,仅返回课程名称字段。
二、筛选条件
MOOCGLE在搜索结果页为用户提供结果的筛选功能,用户可以根据自己的需求,选择筛选条件,包括课程所属课程平台、课程状态(即将开始、正在进行、已结束)、课程是否收费等条件进行对搜索结果进行筛选。
课程平台
由于我们所采集的15000多条数据分别来自六个不同的MOOC平台,考虑到不同用户对课程平台的喜好程度以及会员制度、不同平台的课程质量等原因,所以我们为用户提供了课程平台的筛选条件。使用terms过滤,可以做到根据课程平台ID进行不同平台课程的筛选,可以做到多选和单选,也考虑过使用课程平台名称作为terms过滤的条件,也可以做到筛选效果,但是考虑到课程平台后续的增加会导致可能有名称相近等因素,还是选择增加了课程平台ID这一字段作为筛选条件。上图显示为筛选来自中国大学mooc网和edX的课程。
课程是否免费
现在很多的mooc平台为了维持运营以及收益对部分的课程进行了收费的处理,对于用户来讲,是否收费是个重要的问题,所以MOOCGLE也提供了对课程是否收费的筛选条件,同样是采取了terms过滤,上图显示为筛选免费的课程。
课程状态
课程状态也是一个很重要的筛选条件,用户可以选择即将开始的课程加入跟随课程进度学习、也可选择已结束的课程进行快速回放学习。最开始,我们根据课程状态这个字段进行terms过滤,但是发现存在一个很严重的问题,就是这样需要数据的更新频率极高,至少要做到一天一次更新,并且更新很不容易,需要对每一个课程进行更新。于是,我们考虑根据课程的开始时间与结束时间使用range过滤来进行筛选。
开始时间在今日之后的课程即为即将开始的课程。
开始时间在今日之前、结束时间在今日之后的课程即为正在进行的课程。
结束时间在今日之前的即为已结束的课程。
课程时间
同样使用range过滤也可以对不同时间的课程进行筛选,满足用户对不同时段课程的不同需求。
三、排序条件
MOOCGLE同样为用户对搜索结果提供不同的排序方式,我们使用sort进行排序,sort只能对数值型和日期型进行排序,所以我们提供了按照课程评分排序、按照课程人气排序和按照课程时间进行排序。
课程评分
其中order参数为排序方式,desc为降序排列,asc为升序排列,我们默认按照课程评分的降序排列。
课程人气
课程时间
分页搜索
分页使用了from+size进行浅分页
其中,from定义了目标数据的偏移值,size定义当前返回的数目。
第一页所展示的查询语句from为0,size为10,第二页from为10,size为10,以此类推。
from+size查询在10000-50000条数据(1000到5000页)以内的时候还是可以的,但是如果数据过多的话,就会出现深分页问题。
为了解决上面的问题,elasticsearch提出了一个scroll滚动的方式。
scroll 类似于sql中的cursor,使用scroll,每次只能获取一页的内容,然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容,所以scroll并不适用于有跳页的情景。
文本高亮
对搜索关键字进行高亮显示,由于筛选过程也是用的查询语句,所以考虑过对筛选条件也进行文本的高亮显示,但是后发现课程平台ID这类字段并不显示在查询结果的页面上,并且筛选过后的所有结果都是同一类型的(也就是说筛选条件均为高亮)没有实际意义,所以后删除了对筛选的高亮。高亮效果如下:
四、自动补全及纠错
Elasticsearch中的Suggesters API可以提供自动补全以及纠错的功能。 Suggesters基本的运作原理是将输入的文本分解为token,然后在索引的字典里查找相似的term并返回。 根据使用场景的不同,Elasticsearch里设计了4种类别的Suggester,分别是:
- Term Suggester(纠错补全,输入错误的情况下补全正确的单词)
- Phrase Suggester(自动补全短语,输入一个单词补全整个短语)
- Completion Suggester(完成补全单词,输出如前半部分,补全整个单词)
- Context Suggester(上下文补全)
由于对于mooc的搜索中短语应用比较少,所以phrase suggester在我们项目中的效果并不是非常理想,所以没有采用phrase suggester。而context suggester作为上下文筛选器,对于我们进行课程的搜索可以说作用较小,并且context suggester的难度也较高,于是也没有采用。所以moocgle使用了term suggester和completion suggester做到了自动补全以及纠错(包括拼音的自动补全)。
term suggester:纠错
可以看到分词和纠错的的效果都是比较优秀的。
completion suggester:自动补全
拼音补全
五、聚合查询
聚合框架有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。
指标聚合是对文档进行一些权值计算(比如求所有文档某个字段求最大、最小、和、平均值),输出结果往往是文档的权值,相当于为文档添加了一些统计信息。它基于特定字段(field)或脚本值(generated using scripts),计算聚合中文档的数值权值。
MOOCGLE只是简单的做到了值计数聚合。计算聚合文档中关于某个keyword的课程的个数,未来考虑再增加一些其他聚合查询的内容。
六、分面搜索
分面搜索支持用户根据自己的需要选取不同的分面进行筛选,而不必按照网站预先设定的单一方式寻找。分面搜索允许用户自己创建搜索路径,并且可以随时扩大和缩小结果范围。它只展现有对应结果的选项,避免了无搜索结果的情况。
并且一般在搜索前提示用户该选项内包含的结果数量,给用户良好的操作前提示。
MOOCGLE为用户提供了课程类别的分面搜索,在用户进行查询操作后,动态的根据关键字为用户提供相关的课程类别,同时利用聚合搜索为用户展示每个类别有关的课程的数量。