Elasticsearch(ES)简介
1、为什么要使用搜索框架?
2、Lucene的介绍
3、Lucene和ES的区别?
4、ES的安装
为什么要使用ES或者Lucene?
之前我们接触的都是模糊查询,,但模糊查询不够准确,有很大的局限性!
比如:我爱Java 在模糊查询中:%我爱Java%
但正常情况下我们网页上的搜索:我爱.....;......Java......;......爱Java......;这样的词条的搜索。
为此我们有了 Lucene搜索框架。
1、Lucene(Apache公司的,Lucene使用的Java语言)
Lucene是一个开源的搜索框架,
Lucene core:核心包(提供了很多的搜索引擎和搜索方法)
Solr:借助于Lucene core包提供的搜索方法构建的一个高性能的搜索服务器(使用了xml文件类型和http协议)
并支持json数据格式提供了py和ruby语言的API
PYLucene:Python语言的Lucene
2、ES三大核心:
Index:相当于关系型数据库
Type:相当于关系型数据库中的表
Document:相当于关系型数据库中的表数据
说明:
搜索流程:当服务器端要查询数据时,不会进入数据库中查询,而是进入ES服务器中,先根据Index索引找到对应的库,再根据Type找到对应的表,最后根据Document拿到表数据,一切都是在内存中做计算,内存中的数据则来自于ES服务器中的搜索引擎库中,搜索引擎库中的数据则来自于数据库中。
搜索引擎库:ES中的搜索引擎库类似于数据库,ES服务器第一次搭建完成后(第一次启动),搜索引擎库中没有数据,需要把数据库中的数据导入到搜索引擎库中(需要进行搜索的数据才会导入进来),ES一旦检测到搜索引擎库中有数据,会把这些数据直接加载进内存中。
在ES中自带的有监听机制,监听搜索引擎库中的数据是否有变化,一旦发生变化,需要把搜索引擎库中的数据重新覆盖进内存中。
ES服务器的缺陷:一旦ES服务器重启,内存就会被释放,ES中的数据就会丢失,所以把需要搜索的数据持久化但硬盘中的搜索引擎库中,当ES开始启动的时候,会把硬盘中的持久化数据加载进内存中,所有的一切数据都是在内存中做计算。
3、ES是基于Lucene开发的,但是Lucene和ES都是搜索引擎框架
什么时候使用ES或者说什么时候使用Lucene呢?
即ES和Lucene的区别:
Lucene只是一个搜索架构,不能直接使用,如果需要使用Lucene则需要自己添加代码来实现搜索模块,也就是说必须根据公司的业务逻辑来进行编码搜索,
ES已经把这些代码全部实现了(在Lucene基础上实现的),可以直接使用,不再需要添加任何和架构有关的代码。
4、在Linux中配置ES
(1)先配置jdk
(2)从官网下载ES安装包
(3)解压ES的压缩包 tar -zxvf XXXX(仍然是放在/home/apps/下)
以下配置全部使用root用户,否则配置可能不生效
(4)vi /etc/security/limits.conf
配置某个用户/某些用户对软件的内存和硬盘使用权限,
将下列配置添加进文件内部
* soft nproc 655350
* soft nofile 655350
* hard nproc 655350
* hard nofile 655350
(5)最大线程数(ES一般情况是以集群启动的,所以目前的用户无法满足ES所要创建的线程,所以需要加线程数)
这里只是配置系统可容纳最大线程数,默认系统都有自动保护,不会开启很大的线程数,需要手动修改
vi /etc/sysctl.conf
在最后一行添加: vm.max_map_count = 262144
(6)配置用户最大的线程数:
vi /etc/security/limits.d/90-nproc.conf
将其中的1024 改为 4096
(7)是修改永久生效
sysctl -p
(8)创建用户,因为不能直接使用root去启动es,权限太大
用户名: useradd esuser
密码: passwd esuser
授权: chown -R esuser /home/apps/elasticsearch
(9)使用新创建的用户去启动es
su esuser
进入bin目录下: ./elasticsearch
(10)检测是否启动成功:
浏览器:使用浏览器访问本机服务器的IP+端口号(9200)
{
"name" : "node-1",
"cluster_name" : "my-cluster",
"cluster_uuid" : "UmoHkEZzReGQMrrLShhDIQ",
"version" : {
"number" : "6.4.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "595516e",
"build_date" : "2018-08-17T23:18:47.308994Z",
"build_snapshot" : false,
"lucene_version" : "7.4.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
在配置中遇到的问题:
1.ES为了自我保护,不让使用root用户启动,因为root用户权限过大,容易修改ES自己配置
创建新的用户并且授权
useradd esuser
passwd esuser ---> 123456
授权:
chown -R esuser /home/apps/elasticsearch
2.因为ES需要消耗非常大的线程数量和内存以及硬盘存储空间:
报错及解决:
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[1]:当前启动用户无法对linux系统调动很多的硬盘以及内存存储空间,所以需要自行修改!
vi /etc/security/limits.conf
[2]: max number of threads [1024] for user [esuser] is too low, increase to at least [4096]
[2]:当前启动的用户太low了,无法调动很多的线程(默认只能调动1024)
vi /etc/secrity/limits.d/90-nproc.conf
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[3]:需要配置vi /etc/sysctl.conf文件,加大系统默认的总线程数
3.使用创建出新用户启动没有问题,但是当使用root用户启动一次后,再使用新创建的用户启动就有问题
新创建的用户无法使用root用户所创建出的文件
无论是使用哪一个用户启动都会在config文件夹中创建elasticsearch.keystore文件,root用户权限太大,创建的文件其他用户无法使用,所以会报错!
4.java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
因为最终CONFIG_SECCOMP系统在centos7中默认会被加载,但是在centos6中没有
需要更换centos的版本
1、6版本---->7版本
2、修改es的配置文件
在yml配置文件中添加一行数据 : bootstrap.system_call_filter: false
备注
1 #创建索引并添加映射(推荐) 2 PUT /person 3 { 4 "mappings": { 5 "properties": { 6 "name": { 7 "type": "text" 8 }, 9 "age": { 10 "type": "integer" 11 } 12 } 13 } 14 } 15 16 #删除索引 17 DELETE /person/ 18 19 #查询映射 20 GET person/_mapping 21 22 23 #添加字段 24 PUT /person/_mapping 25 { 26 "properties": { 27 "name": { 28 "type": "text" 29 }, 30 "age": { 31 "type": "integer" 32 } 33 } 34 } 35 36 37 #添加文档,不指定id 38 POST /person/_doc/ 39 { 40 "name":"张三", 41 "age":18, 42 "address":"北京" 43 } 44 45 #查询所有文档 46 GET /person/_search 47 48 49 50 #删除指定id文档 51 DELETE /person/_doc/1
1 # 根据某个字段查询 2 Get http://localhost:9200/article/_search?q=name:张三 3 body:{"query":{"match_all":{}}} 4 5 删除某条数据 6 # 根据上一步获取的ID进行删除 7 POST product/_delete_by_query 8 body:{"query":{"term":{"_id":"64491a2b9d9b3f8f5d5122cc0c84fc67"}}}