说明:本篇文章主要是经过springboot整合es的基本使用基础,详细了解的能够看我上一篇文章:全文搜索-ElasticSearchhtml
有朋友私信我上一篇没有环境搭建方面的,这里给你细说一下。java
官方文档node
Elasticsearch是一个开源的搜索引擎,创建在一个全文搜索引擎库Apache Lucene™基础之上。 Lucene能够说是当下最早进,高性能,全功能的搜索引擎库 - 不管是开源仍是私有。mysql
可是Lucene仅仅是一个库。为了充分发挥其功能,你须要使用Java并将Lucene直接集成到应用程序中。更糟糕的是,您可能须要得到信息检索学位才能了解其工做原理.Lucene 很是复杂。linux
Elasticsearch也是使用Java编写的,它的内部使用Lucene作索引与搜索,可是它的目的是使用全文检索变得简单,经过隐藏Lucene的复杂性,取而代之的提供一套简单一致的RESTful API。git
然而,Elasticsearch不只仅是Lucene,而且也不只仅是一个全文搜索引擎。 它能够被下面这样准确的形容:github
Elasticsearch将全部的功能打包成一个单独的服务,这样你能够经过程序与它提供的简单的RESTful API进行通讯,可使用本身喜欢的编程语言充当web客户端,甚至可使用命令行(去充当这个客户端)。web
就Elasticsearch而言,起步很简单。对于初学者来讲,它预设了一些适当的默认值,并隐藏了复杂的搜索理论知识。它开箱即用。只需最少的理解,你很快就能具备生产力。spring
Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON做为文档序列化的格式,好比下面这条用户数据:sql
{ "name" : "hello world", "sex" : 0, "email": "10086@qq.com" "age" : 20 }
关系数据库 ⇒ 数据库(database) ⇒ 表(table) ⇒ 行 (row) ⇒ 列(Columns)
Elasticsearch ⇒索引(index) ⇒类型(type) ⇒文档(docments) ⇒字段(fields)
Elasticsearch能够存放大量数据,Elasticsearch集群很是容易横向扩展,并且检索性能很是好,在大数据量的状况下相比于mysql等性能上有很大的优点,下面的几个优点:
**横向可扩展性:**只须要增长台服务器或者添加节点,在分布式配置中心更新配置,启动Elasticsearch的服务器就能够并入集群。
**分片机制提供更好的分布性:**同一个索引分红多个分片(sharding), 这点相似于分布式文件系统的块机制;分而治之的方式可提高处理效率。
**高可用:**提供复制( replica) 机制,一个分片能够设置多个复制,使得某台服务器在宕机的状况下,集群仍旧能够照常运行,并会把服务器宕机丢失的数据信息复制恢复到其余可用节点上。
使用简单:只需一条命令就能够下载文件,而后很快就能搭建一一个站内搜索引擎。
Elasticsearch | solr | |
---|---|---|
优势 | Elasticsearch是分布式的。不须要其余组件,分发是实时的,被叫作”Push replication”。Elasticsearch 彻底支持 Apache Lucene 的接近实时的搜索。处理多租户不须要特殊配置,而Solr则须要更多的高级设置。Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。各节点组成对等的网络结构,某些节点出现故障时会自动分配其余节点代替其进行工做。 | Solr有一个更大、更成熟的用户、开发和贡献者社区。支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。Solr比较成熟、稳定。不考虑建索引的同时进行搜索,速度更快。 |
缺点 | 只有一名开发者(当前Elasticsearch GitHub组织已经不仅如此,已经有了至关活跃的维护者)还不够自动(不适合当前新的Index Warmup API) | 创建索引时,搜索效率降低,实时索引搜索效率不高。 |
对于两个全文索引的框架,得考虑系统架构、技术选型、人员等等方面的因素进行对比使用
后期会更新关于solr的文章
elasticsearch默认运行内存为1G,最好设置初始化内存和最大内存
安装JDK1.8以上环境
这里使用Elasticsearch的版本是6.4.3,同时使用kibana可视化工具使用,对elasticsearch-head感兴趣的能够download使用
docker pull elasticsearch:6.4.3 docker pull mobz/elasticsearch-head:5 docker pull kibana:6.4.3
docker run -it --name elasticsearch -d -p 9200:9200 -p 9300:9300 -p 5601:5601 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:6.4.3
注意事项
kibana的container共用elasticsearch的网络
elasticsearch服务有跨域问题,致使elasticsearch-head没法链接到ES,所以须要进入ES容器修改配置
docker exec -it elasticsearch /bin/bash vi config/elasticsearch.yml 加入跨域配置 http.cors.enabled: true http.cors.allow-origin: "*"
退出容器:exit
docker restart elasticsearch
docker run -it -d -e ELASTICSEARCH_URL=http://ip:9200 --name kibana --network=container:elasticsearch kibana:6.4.3
docker run -it --name elasticsearch-head -d -p 9100:9100 docker.io/mobz/elasticsearch-head:5
一、 安装JDK环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_181 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar source /etc/profile
二、 下载elasticsearch安装包
下载elasticsearch安装包
注意:linux安装内存建议1g内存以上
三、 上传elasticsearch安装包(这里使用xshell 与 xshell ftp)
四、 解压elasticsearch
tar -zxvf elasticsearch-6.4.3.tar.gz
五、 修改elasticsearch.yml
network.host: 对应本地ip
http.port: 9200
六、启动elasticsearch报错
cd /usr/local/elasticsearch-6.4.3/bin ./elasticsearch
可能出现的错误:
这里出现的错误借鉴网络
报错1:can not run elasticsearch as root 解决方案: 由于安全问题elasticsearch 不让用root用户直接运行,因此要建立新用户 第一步:liunx建立新用户,而后给建立的用户加密码,输入两次密码。 第二步:切换刚才建立的用户,而后执行elasticsearch,会显示Permission denied 权限不足。 第三步:给新建的用户赋权限,chmod 777 * 这个不行,由于这个用户自己就没有权限,确定本身不能给本身付权限。因此要用root用户登陆付权限。 第四步:root给用户赋权限,chown -R XXX /你的elasticsearch安装目录。 而后执行成功。 下面一些操做: groupadd user_group useradd username-g user_group -p 123456 chown -R username:user_group elasticsearch-6.4.3 chown -R username:user_group 切换用户: su username ./elasticsearch 报错2: bootstrap checks failed max virtual memory areas vm.max_map_count [65530] is vi /etc/sysctl.conf vm.max_map_count=655360 sysctl -p ./elasticsearch 报错3: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] vi /etc/security/limits.conf * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096 重启服务器便可 记得,这个很重要。 ./elasticsearch
七、访问elasticsearch
关闭防火墙,能够的话设置永久关闭防火墙,自行百度
systemctl stop firewalld.service
中途可能会出现不少坑,记得当心,我搭建却是没有这么多问题,我朋友的就出现了挺多的
一、下载
二、上传,解压
tar -zxvf kibana-6.4.3-linux-x86_64.tar.gz
三、配置
vim config/kibana.yml # 将默认配置改为以下: server.port: 5601 server.host: "你的ip" #elasticsearch的服务 elasticsearch.url: "http:// 你的ip:9200"
四、启动Kibana
./bin/kibana
五、运行
GET _search { "query": { "match_all": {} } } # 索引index 类型type 文档document 属性field PUT /gitboy/user/1 { "name":"hello", "sex":1, "age":22 } PUT /gitboy/user/2 { "name":"hello2", "sex":1, "age":22 } GET /gitboy/user/1
基本索引的命令以及操做能够借鉴我上一篇文章
新建工程什么的就不说了,直接来吧!
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
spring: data: elasticsearch: ####集群名称 cluster-name: elasticsearch ####地址 cluster-nodes: 139.196.81.0:9300
@Document(indexName = "cluster_name索引", type = "user")//注意cluster_name索引 @Data public class UserEntity { @Id private String id; private String name; private int sex; private int age; }
public interface UserReposiory extends CrudRepository<UserEntity, String> { }
public interface UserService { public UserEntity addUser( UserEntity user); public Optional<UserEntity> findUser(String id); } @Service public class UserServiceImpl implements UserService { @Autowired private UserReposiory userReposiory; @Override public UserEntity addUser(UserEntity user) { return userReposiory.save(user); } @Override public Optional<UserEntity> findUser(String id) { return userReposiory.findById(id); } }
@RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/addUser") public UserEntity addUser(@RequestBody UserEntity user) { return userService.save(user); } @RequestMapping("/findUser") public Optional<UserEntity> findUser(String id) { return userService.findById(id); } }
@SpringBootApplication @EnableElasticsearchRepositories(basePackages = "com.example.repository") public class AppEs { public static void main(String[] args) { SpringApplication.run(AppEs.class, args); } }
由于Elasticsearch中默认的标准分词器分词器对中文分词不是很友好,会将中文词语拆分红一个一个中文的汉子。所以引入中文分词器-es-ik插件
下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
注意: es-ik分词插件版本必定要和es安装的版本对应
第一步:下载es的IK插件(资料中有)命名改成ik插件 第二步: 上传到/usr/local/elasticsearch-6.4.3/plugins 第三步: 重启elasticsearch便可
在/usr/local/elasticsearch-6.4.3/plugins/ik/config目录下
vi custom/new_word.dic 吃鸡 王者荣耀 码云 马云
3.2 配置
vi IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户能够在这里配置本身的扩展字典 --> <entry key="ext_dict">custom/new_word.dic</entry> <!--用户能够在这里配置本身的扩展中止词字典--> <entry key="ext_stopwords"></entry> <!--用户能够在这里配置远程扩展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用户能够在这里配置远程扩展中止词字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
已经把ElasticSearch的核心概念和关系数据库作了一个对比,索引(index)至关于数据库,类型(type)至关于数据表,映射(Mapping)至关于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,能够定义所包含的字段以及字段的类型、分词器及属性等等。
文档映射就是给文档中的字段指定字段类型、分词器。
使用GET /gitboy/user/_mapping
咱们知道,在关系数据库中,须要事先建立数据库,而后在该数据库实例下建立数据表,而后才能在该数据表中插入数据。而ElasticSearch中不须要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。
在ElasticSearch中也能够事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。
符串:string,string类型包含 text 和 keyword。
text:该类型被用来索引长文本,在建立索引前会将这些文本进行分词,转化为词的组合,创建索引;容许es来检索这些词,text类型不能用来排序和聚合。
keyword:该类型不须要进行分词,能够被用来检索过滤、排序和聚合,keyword类型自读那只能用自己来进行检索(不可用text分词后的模糊检索)。
注意: keyword类型不能分词,Text类型能够分词查询
数指型:long、integer、short、byte、double、float
日期型:date
布尔型:boolean
二进制型:binary
数组类型(Array datatype)
地理坐标类型(Geo-point datatype):geo_point 用于经纬度坐标
地理形状类型(Geo-Shape datatype):geo_shape 用于相似于多边形的复杂形状
Pv4 类型(IPv4 datatype):ip 用于IPv4 地址
Completion 类型(Completion datatype):completion 提供自动补全建议
Token count 类型(Token count datatype):token_count 用于统计作子标记的字段的index数目,该值会一直增长,不会由于过滤条件而减小
mapper-murmur3 类型:经过插件,能够经过_murmur3_来计算index的哈希值
附加类型(Attachment datatype):采用mapper-attachments插件,可支持_attachments_索引,例如 Microsoft office 格式,Open Documnet 格式, ePub,HTML等
Analyzer 索引分词器,索引建立的时候使用的分词器 好比ik_smart
Search_analyzer 搜索字段的值时,指定的分词器
正排表是以文档的ID为关键字,表中记录文档中每一个字的位置信息,查找时扫描表中每一个文档中字的信息直到找出全部包含查询关键字的文档。
这种组织方法在创建索引的时候结构比较简单,创建比较方便且易于维护;由于索引是基于文档创建的,如果有新的文档加入,直接为该文档创建一个新的索引块,挂接在原来索引文件的后面。如果有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。可是在查询的时候需对全部的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。
尽管正排表的工做原理很是的简单,可是因为其检索效率过低,除非在特定状况下,不然实用性价值不大。
倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的全部文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置状况。
因为每一个字或词对应的文档数量在动态变化,因此倒排表的创建和维护都较为复杂,可是在查询的时候因为能够一次获得查询关键字所对应的全部文档,因此效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引创建因为在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。
正排索引是从文档到关键字的映射(已知文档求关键字),倒排索引是从关键字到文档的映射(已知关键字求文档)。