一、团队课程设计博客链接

https://www.cnblogs.com/Rasang/p/12169899.html

二、个人负责模块或任务说明

2.1Elasticsearch简介

Elasticsearch是使用Java编写的一种开源搜索引擎,它在内部使用Luence做索引与搜索,通过对Lucene的封装,提供了一套简单一致的RESTful API。Elasticsearch也是一种分布式的搜索引擎架构,可以很简单地扩展到上百个服务节点,并支持PB级别的数据查询,使系统具备高可用和高并发性。

2.2个人任务说明

任务:利用Elasticsearch进行检索,需实现的功能如下:

  • 导入数据建立索引库(包括使用ik分词器进行中文分词)
  • 保存历史搜索(用于搜索自动补全)
  • 搜索自动补全(使用completion suggester实现,补全的建议优先从历史搜索中获取,建议数量不足时再从索引的标题(title)段中获取)
  • 全文检索(搜索时需先用ik分词器进行分词,之后再根据分词后得到的词条进行检索,检索的结果需进行分页返回)

三、自己的代码提交记录截图

github项目地址:https://github.com/xingkyh/searchEngine













四、自己负责模块或任务详细说明

Elasticsearch模块:

  • EsClient类:用于链接elasticsearch
  • EsCreatIndex类:用于创建索引、向索引中插入数据
  • EsSearch类:用于执行全文检索请求并返回检索结果
  • EsSuggest类:用于获取搜索建议以便于搜索时进行自动补全

(以下讲解我只会贴出部分代码,完整代码请到本人的github上查看)

4.1EsClient类

4.1.1属性

  • indexName:索引名称
  • typeName:索引下的字段名称(elasticsearch6.0及以上每个index仅允许存在一个type)
  • suggestName:用于保存历史搜索的库的名称
  • jestClient与transportClient:API连接elasticsearch之后用于操作的对象

4.1.2jest API连接elasticsearch

4.1.3transport API连接elasticsearch

4.2EsCreatIndex类

4.2.1索引的创建与mapping的写入





mapping关键属性:

  • type:字段的类型,在本次课设中字符串为text(旧版本为string),日期为data,设置为completion则代表此字段将用于搜索时自动补全(但也会导致此字段无法进行检索,若想此字段仍可用于检索,请在此字段中添加一个附加字段并将附加字段属性设置为completion,原字段属性设置为text,获取自动补全建议时使用附加字段)
  • analyzer:生成倒排索引时使用的分词方式,一般使用ik_max_word(最细拆分)
  • search_analyzer:搜索时,对搜索请求使用的分词器,一般使用ik_smart(最粗拆分)

对于elasticsearch来说maping就相当与mysql的表结构,elasticsearch内部是使用json文档来存储数据的,导入数据时elasticsearch会根据mapping来生成json文档来保存数据(若无mapping或mapping中无对应字段则elasticsearch会判断导入的数据类型并自动生成mapping),建立索引库和搜索时使用的分词方式也是在mapping进行设置的,可以说索引的建立的关键就在于mapping的设计与写入。

(在学elasticsearch时,最让我头疼最久的就是这个mapping)

4.2.2插入数据

单独插入



批量插入

4.2.3删除索引

4.3EsSearch类

4.3.1全文检索

不带日期限制的检索





带日期限制的检索

4.3.2保存历史搜索



由于历史搜索中可能存在相同的搜索,若不经处理就直接保存可能会导致自动补全时出现重复的建议,所以在此处插入数据的时候需要手动指定id,由于elasticsearch内部是使用唯一id来标识文档的,当插入的文档的id已经存在时,文档就不会插入,而是会更新原id标识的文档,因此我在此处使用了MD5来加密字符串生成一个唯一的32位id,当数据相同时生成的id也会相同,这样就不会有数据重复的问题了。(不过MD5加密字符串仍有概率会生成一样的32位散列,但这个概率极小,基本可以忽略不记)

4.4EsSuggest类

4.4.1返回搜索建议



搜索建议优先从历史搜索中获取,当建议不足10条时会从索引的标题(title)字段中获取其余的建议,以下代码是将获取建议的请求提交到elasticsearch的具体操作



ps:这一部分我是使用teansport API来写的,其它部分则是jest API

五、课程设计感想

从刚开始接触elasticsearch到完成这一部分代码断断续续差不多花了我一个月左右的时间(其实大部分时间都用来处理其它事情,比如复习准备考试之类的,真正用来打代码的时间并不多),最开始的时候,我从网上搜索java操作elasticsearch时,我便了解到了存在多种java操作elasticsearch的API,每种API的具体使用方式都有一定的区别,于是,经过一番对比之后我决定使用jest API来编写代码,但刚开始编写我便遇上了让我最为头疼的一块--mapping,为了能设计好mapping我在网上参考了很多资料,但大部分资料讲的都是直接使用Restful来直接操作的,其设计的mapping并不能直接用于jest操作使用,经过了一番努力,在我大致理解mapping中各个字段的意义之后,我终于设计好了mapping,但也因此又遇到了一个问题--mapping无法写入,为此我又到处去查找资料,最终在查看了请求的错误信息后我发现了是elasticsearch新版本新增的一个字段所导致的问题,由于我不知如何设置这个字段,所以只好将elasticsearch的版本由7.4.2更换为6.8.5才解决了这个问题,之后代码一直顺利写到了全文检索,但当我开始写自动补全时,又出现了一个问题,不知是我使用的jest的版本问题还是什么,其缺少了一个类,导致了我无法使用jest来编写自动补全这一部分的代码,所以我迫不得已只好使用teansport API来编写这一部分代码,但又由于我一开始设计mapping时没有考虑到这一部分功能,所以只好回去重写mapping,但重写之后我发现用于获取搜索建议的字段无法进行检索,为此我又去查找资料,最终在我了解到了附加字段使用方式之后,我将用于获取建议的字段由原字段改为原字段的附加字段并保持原字段不变来解决这个问题,至此这一模块的代码才终于全部完成了。

java课程设计之--Elasticsearch篇的更多相关文章

  1. Java课程设计之——爬虫篇

    主要使用的技术 Httplcient Jsoup 多线程 dao模式 网络爬虫简介 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取 ...

  2. Java课程设计(2019版)

    参考资料 Java课程设计参考资料(2018-12-26更新) Java课程设计常见问题(程序部署.数据库.JSP) 项目开发参考-阿里巴巴Java开发手册(正式版) 更多参考资料请查看QQ群文件中的 ...

  3. Java课程设计-算术运算测试(D级) 齐鲁工业大学 计科20-1 王瀚垠 202003010033

    Java课程设计-算术运算测试(D级) 齐鲁工业大学 计科20-1 王瀚垠 202003010033 目录 1.项目简介 2.项目采用技术 3.功能需求分析 4.项目亮点 5.项目功能架构图和UML类 ...

  4. java(课程设计之记事本界面部分代码公布)

    代码:涉及记事本的一些界面......!! /* *java课程设计之记事本(coder @Gxjun) * 编写一个记事本程序 * 要求: * 用图形用户界面实现. * 能实现编辑.保存.另存为.查 ...

  5. java课程设计(计算器)

    JAVA课程 设 计 报 告 1206401-18   瞿杰 一.设计时间 2013年6月 24日-----6月28日 二.设计地点 湖南城市学院实验楼计算机506机房 三.设计目的 1.巩固学习VB ...

  6. Java课程设计——博客作业教学数据分析系统(201521123084 林正晟)

    #课程设计--博客作业教学数据分析系统(201521123084 林正晟) 1.团队课程设计博客链接 博客作业教学数据分析系统 2.个人负责模块或任务说明 学生登陆界面的前端实现和与数据库的连接 学生 ...

  7. Java课程设计——博客作业教学数据分析系统(201521123082 黄华林)

    Java课程设计--博客作业教学数据分析系统(201521123082 黄华林) 一.团队课程设计博客链接 博客作业教学数据分析系统(From:网络五条狗) 二.个人负责模块或任务说明 1.网络爬虫 ...

  8. java课程设计--We Talk(201521123061)

    java课程设计--We Talk(201521123061) 团队博客链接:http://www.cnblogs.com/slickghost/ 数据库 一.通过Dao模式建立与数据库的连接 1.数 ...

  9. Java 课程设计 "Give it up"小游戏(团队)

    JAVA课程设计 "永不言弃"小游戏(From :Niverse) 通过Swing技术创建游戏的登陆注册界面,使用mySQL数据库技术完成用户的各项信息保存和游戏完成后的成绩保存. ...

随机推荐

  1. Spinner 用法

    </Spinner> <TextView android:layout_width="wrap_content" android:layout_height=&q ...

  2. ECCV 2018 目标检测 | IoU-Net:将IoU的作用发挥到极致

    常见的目标检测算法缺少了定位效果的学习,IoU-Net提出IoU predictor.IoU-guided NMS和Optimization-based bounding box refinement ...

  3. 深入Redis命令的执行过程

    深入Redis命令的执行过程 Redis 服务器: Redis 服务器实现与多个客户端的连接,并处理这些客户端发送过来的请求,同时保存客户端执行命令所产生的数据到数据库中.Redis 服务器依靠资源管 ...

  4. nopcommerce4.0 安装步骤

    前言:近期因工作要求接触nopcommerce,最新版本为4.0,以下所有安装都是基于此版本.接下来我可能会写一系列,为了让自己更好的掌握,也希望能帮助到大家 好记性不如烂笔头,新手也可以避免走我的弯 ...

  5. C#中的9个“黑魔法”与“骚操作”

    C#中的9个"黑魔法"与"骚操作" 我们知道C#是非常先进的语言,因为是它很有远见的"语法糖".这些"语法糖"有时过于好 ...

  6. 手把手教你学Git

    Git 使用手册独家实战 0.查看本机公钥 步骤: 1.进入.ssh目录 cd ~/.ssh 2.找到id_rsa.pub文件 ls / ll 3.查看文件 cat id_rsa.pub JackFe ...

  7. 谷歌出品EfficientNet:比现有卷积网络小84倍,比GPipe快6.1倍

    [导读]谷歌AI研究部门华人科学家再发论文<EfficientNet:重新思考CNN模型缩放>,模型缩放的传统做法是任意增加CNN的深度和宽度,或使用更大的输入图像分辨率进行训练,而使用E ...

  8. 震惊!程序员的福音!不需要敲代码就能完成复杂的逻辑应用? —— Azure Logic App

    (大家看完标题可能以为是营销号,哈哈哈哈哈哈哈哈哈...客官请留步, 正经博主....好吧) 今天我们的主题是Azure Logic Apps Azure Logic Apps 是什么? 官方解释:h ...

  9. 一些数组笔记(C)

    0.数组名是一个指针,存放数组首元素地址,所以使用scanf()接受字符串输入时只用写上数组名,不用加&.数组名是常量不允许修改其值.数组只能定义的时候初始化,后期初始化会被认为是修改数组名的 ...

  10. coding++:JS数组去重的几种常见方法

    一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ function uniq ...