一.什么是Elasticsearch?
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于[云计算]中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
ElaticSearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
ElaticSearch相当于数据库,但只存储JSON数据。
二. ElaticSearch解决什么问题?
1.传统的方式进行搜索的时候速度慢
2.搜索的精度不高
解决办法:
通过倒排索引结构来实现。(1.建立倒排的流程 2.根据倒排查询数据流程)
传统的方式: 先找文档,再找内容 再匹配 速度慢
倒排索引:通过词找文档 直接找数据,速度快。
三.ElasticSearch安装与启动
ElasticSearch的官方地址: https://www.elastic.co/products/elasticsearch
Window版的ElasticSearch的安装很简单,解压开即安装完毕,解压后的ElasticSearch的目录结构如下:
启动:
注意:
9300是TCP通讯端口,集群间和TCPClient都执行该端口,可供Java程序调用;
9200是http协议的RESTful接口 。
通过浏览器访问ElasticSearch服务器,看到如下返回的json信息,代表服务启动成功:
安装ES的图形化界面插件 :
ElasticSearch不同于Solr自带图形化界面,我们可以通过安装ElasticSearch的head插件,完成图形化界面的效果,完成索引数据的查看。
四.基本概念
索引 index ---> 数据库的库
类型 type ---> 数据库的表 (已废弃)
文档 document ---> 数据库的表中的行
字段 Field ---> 数据库中的行的列
映射 Mapping ---> 列的限制(约束)
Field中有四个重要的属性:数据类型,是否分词 是否存储 是否索引. 类似于指定数据库中的表中的列的一些约束,需要根据不同的应用场景来决定使用哪种数据类型和属性值。
+ 数据类型 :定义了该Field的数据存储的方式 有基本数据类型 和 字符串类型以及 复杂的数据类型
+ 是否分词 :定义了该字段的值是否要被索引。分词的目的就是为了要索引
(分词就是切词的过程叫分词)
+ 是否索引 :定义了该字段是否要被搜索 要索引的目的就是为了要搜索
+ 是否存储 :定义了是否该存储该数据到底层的lucene中.默认是不存储的。存储不存储看页面是否需要展示
接近实时 NRT(near real time)
Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒以内)
集群 cluster
一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。
节点 node
一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。
操作ElasticSearch
java api 使用 spring data elasticsearch
五.实操 搭建ElasticSearch操作环境
创建一个springboot工程,注意添加springboot 的spring data elasticsearch的起步依赖,我们使用该起步依赖中的transport-elasticsearch的官方的API
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</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.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
创建启动类和配置连接服务器地址
@SpringBootApplication
public class ESApplication {
public static void main(String[] args) {
SpringApplication.run(ESApplication.class, args);
}
}
yml文件
server:
port: 8080
spring:
data:
elasticsearch:
cluster-nodes: 127.0.0.1:9300
cluster-name: elasticsearch
六.操作ElasticSearch
新建索引+添加文档
创建实体对象用于存储数据转成JSON
@Data
public class Article implements Serializable {
private Long id;
private String content;
private String title;
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class EsTest {
@Autowired
private TransportClient transportClient;//操作链接到es服务端的客户端API
@Autowired
private ObjectMapper objectMapper;//json的转换器
//insert //update
//创建索引 创建类型 创建文档 能自动的进行映射 ( blog01,article类型,docuemnt数据(JSON))
/**
* {
* "id":1,
* "title":"十九届六中全会标题"
* "content":"细读十九届六中全会精神内容"
* <p>
* }
*/
@Test
public void create() throws Exception {
//restTemplate
Article article = new Article(1L, "十九届六中全会标题", "细读十九届六中全会精神内容");
String jsonstr = objectMapper.writeValueAsString(article);
//参数1 指定索引名
//参数2 指定类型名称
//参数3 指定文档的唯一标识
IndexResponse indexResponse = transportClient.prepareIndex("blog01", "article", "1")
//参数1 指定文档的数据是一个JSON字符串
//参数2 指定数据类型 JSON数据类型
.setSource(jsonstr, XContentType.JSON)
//指定动作 将数据存储到es服务器中
.get();
System.out.println(indexResponse.getIndex() + ":" + indexResponse.getVersion() + ":" + indexResponse.getType());
}
//update
//delete
@Test
public void delete() {
//删除文档ID为1的数据
transportClient.prepareDelete("blog01", "article", "1").get();
}
//select 数据
@Test
public void select() {
GetResponse docuemntResponse = transportClient.prepareGet("blog01", "article", "1").get();
Map<String, Object> sourceAsMap = docuemntResponse.getSourceAsMap();
String sourceAsString = docuemntResponse.getSourceAsString();
System.out.println(sourceAsMap);
System.out.println(sourceAsString);
}
}