什么是ElasticSearch ?
基于Lucene的搜索服务器,常被当做一个文档型 NoSQL 数据库在使用
Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎
默认端口:9200
使用 Elastic Search有什么好处?
Elasticsearch可扩展高达PB级的结构化和非结构化数据
Elasticsearch可以用来替代MongoDB和RavenDB等做文档存储。
Elasticsearch使用非标准化来提高搜索性能。
Elasticsearch是受欢迎的企业搜索引擎之一,目前被许多大型组织使用,如Wikipedia,The Guardian,StackOverflow,GitHub等。
Elasticsearch是开放源代码,可在Apache许可证版本2.0下提供
Elastic Search有哪些特性?
Elasticsearch是基于Java开发的,这使得它在几乎每个平台上都兼容
Elasticsearch是实时的
Elasticsearch是分布式的
与Apache Solr相比,在Elasticsearch中处理多租户非常容易
Elasticsearch使用JSON对象作为响应Elasticsearch支持
如何使用 ElasticSearch?
首先用户将数据提交到Elastic Search 数据库中
再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据
当用户搜索数据时候,再根据权重将结果排名,打分
最后将返回结果呈现给用户
新建ElasticSearch项目
ElasticSearch可以从elasticsearch.org下载对应的文件格式(如ZIP和TAR.GZ)
提前安装Java运行时环境
所使用的环境是Windows,可从命令窗口运行位于bin文件夹中的elasticsearch.bat
启动ElasticSearch在控制台的前台运行,这意味着我们可在控制台中看到运行信息或一些错误信息,并可以使用CTRL + C停止或关闭它•
Elasticsearch和RDBMS之间的比较
在Elasticsearch中,索引是类型的集合,因为数据库是RDBMS(关系数据库管理系统)中表的集合。每个表都是行的集合,就像每个映射都是JSON对象的Elasticsearch集合一样。
Elasticsearch | 关系数据库 |
---|---|
索引(index) | 数据库 |
碎片 | 碎片 |
映射(type) | 表 |
Document | 行 |
Field | 列 |
JSON对象 | 元组 |
SpringBoot + Elasticsearch 实战
pom.xml
<!-- Java High Level REST Client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
application.properties
server.port=8833
spring.application.name=my-application
elasticsearch.address=localhost:9200
配置类
@Configuration
@Slf4j
public class ESConfig {
// 地址长度
private static final int ADDRESS_LENGTH = 2;
// 地址方式
private static final String HTTP_SCHEME = "http";
// 权限验证
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
/**
* 使用冒号隔开ip和端口
*/
@Value("${elasticsearch.address}")
private String[] address;
// @Value("${elasticsearch.username}")
// private String username;
// @Value("${elasticsearch.password}")
// private String password;
@Bean
public RestClientBuilder restClientBuilder() {
HttpHost[] hosts = Arrays.stream(address)
.map(this::makeHttpHost)
.filter(Objects::nonNull)
.toArray(HttpHost[]::new);
log.debug("hosts:{}", Arrays.toString(hosts));
// 配置权限验证
// credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder restClientBuilder = RestClient.builder(hosts).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
return restClientBuilder;
}
@Bean(name = "highLevelClient")
public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {
// restClientBuilder.setMaxRetryTimeoutMillis(60000);
return new RestHighLeve