入门全文检索引擎ElasticSearch

2020-05-27 00:00:00 查询 数据 字段 节点 请求

1)ElasticSearch基本介绍

ElasticSearch(以下简称ES)是Java编写的基于Lucene之上的全文检索服务器,它在Lucene的基础上做了简化,使用RESTful的形式提供分布式的全文检索功能。它在海量数据检索方面是Mysql远不能及的,对于一些需要从大量文本中按照特定条件检索数据的场景,比如博客的文章检索系统,用户输入关键字搜索时不只是匹配标题那么简单,还需要对文章正文中的数据匹配,使用ES显然比Mysql更为合适且高效。区别于Mysql,ES的结构名称不同,但都有对应关系:

!在ES6.x版本之后官方推荐在一个Index(索引)里尽量保证只有一个Type(类型)。

  • 索引(Index):含有相同属性的文档的集合,索引名称必须是小写字母
  • 类型(Type):索引可以定义一个或多个类型,文档必须属于一个类型
  • 文档(Document):文档是数据存储的基本单位,对应Mysql的一行记录
  • 字段(Field):ES中的字段与Mysql中的列概念是一样的
  • 映射(Mapping):映射定义了ES的数据存储结构

2)RESTful API的格式

ES提供了RESTful形式的API可供使用,我们有必要了解URL中每段对应的是什么:http://:<端口>/<索引>/<类型>/<文档id>,辅以HTTP请求方法如GET、POST、DELETE、PUT等可以完成对ES的各种操作。

3)部署ElasticSearch

3.1)部署一个单节点的ElasticSearch

因为ES是使用Java语言编写的,运行需要Java环境支持,6.x版本注意对应Java 8,如果安装了高版本如JDK13可能导致版本不匹配而出现Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.jdk.internal.vm.annotation")等异常导致ES启动失败。由于我的电脑中只安装了JDK13,所以只能找7.x版本适配。这里使用的是Linux(Ubuntu18.04)环境,下载7.3.2版本的tar.gz文件(Windows环境下载对应文件并双击运行bin下的elasticsearch.bat文件即可)并解压(sudo tar -zxvf elasticsearch-7.3.2-no-jdk-linux-x86_64.tar.gz),ES解压后的目录如下:

  • bin:ES的启动脚本程序(重要)
  • config:ES配置文件(重要)
  • lib:运行时依赖的第三方库
  • logs:运行的日志信息
  • modules:ES的模块程序目录
  • plugins:放置第三方插件的目录(重要)

Linux下不能使用root用户(包括sudo)运行脚本,需要一个普通用户。同样因为Linux中的权限问题,直接运行脚本会提示无法访问配置文件,还需要使用命令sudo chown -R tiny:tiny elasticsearch-7.3.2对当前用户赋予对文件夹下内容的访问权限(tiny:tiny分别是用户组和组中用户)。后进入到ES文件夹下执行bin/elasticsearch &启动ES(加'&'可以后台形式启动ES,不会阻塞Bash进程);启动无报错信息后在浏览器输入localhost:9200回车,出现类似如下响应表示一个单节点的ES启动成功:

!ElasticSearch在国内的下载速度缓慢,可从此网站下载需要的ES

3.2)安装Elasticsearch-head

可以看到ES返回的都是JSON形式的响应,对于用户来说并不友好,我们需要一个更为人性化的前端系统来展示和管理ES,这就是下面要用到的ealsticsearch-head。

安装elasticsearch-head前需要先安装node.js环境和npm,Ubuntu下使用命令安装:sudo apt install nodejssudo apt install npm;接下来拉取elasticsearch-head的代码:sudo git clone git://github.com/mobz/elasticsearch-head.git,然后进入elasticsearch-head目录下,此时还需要安装phantomjs-prebuilt,因为使用默认源安装会卡住,我们需要指定一下它的下载源:npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/,然后再执行命令sudo npm install phantomjs-prebuilt,此时可能出现错误:

执行sudo npm install phantomjs-prebuilt@2.1.16 --ignore-scripts,安装成功了!接下来开始正题,执行sudo npm install安装elasticsearch-head,安装成功后使用命令npm run start启动。

使用浏览器访问:localhost:9100,会看到如下界面:

可以看到elasticsearch-head并没有连接到ES,这是因为它们之间存在跨域问题导致elasticsearch-head无法正常访问到ES;接下来需要需改ES的配置文件,让它支持跨域访问:先停止ES,到它的根目录下,执行sudo vim config/elasticsearch.yml,在其中加入如下配置:

# 设置支持跨域访问ES
http.cors.enabled: true
http.cors.allow-origin: "*"

相关文章