ElasticSerrch
概述
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
简介
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务
安装
以windows操作系统和ES0.19.7版本为例:
网址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-9-0
①下载elasticsearch-6.4.1.zip
②直接解压至某目录,设置该目录为ES_HOME[环境变量](https://baike.baidu.com/item/环境变量
③安装JDK,并设置JAVA_HOME环境变量
④在windows下,运行 %ES_HOME%\bin\elasticsearch.bat即可运行
以head插件为例:
联网时,直接运行%ES_HOME%\bin\plugin --install mobz/elasticsearch-head。
不联网时,下载elasticsearch-head的zipball的master包,然后运行%ES_HOME%\bin\plugin --url file:///[path-to-downloadfile] --install head,其中[path-to-downloadfile]是下载后master包的绝对路径。
安装完成,重启服务,在浏览器打开 http://localhost:9200/_plugin/head/ 即可。
启动:ElasticSerrch服务,双击elasticsearch.bat即可
修改密码:
1.在yml的最低下加上
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
2.切换到ElasticSerrch的bin目录
3.elasticsearch-setup-passwords interactive
4.y
5.输入密码
注意:密码是看不见的,自己要记住
代码实现
注意:此期间ElasticSerrch的服务要开著
1.引入pom依赖 elasticsearch
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.配置连接的参数
@Configuration
public class ElasticSearchConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient restHighLevelClient(){
//无密码
//RestClientBuilder builder = RestClient.builder(new HttpHost("localhost",9200,"http"));
//return new RestHighLevelClient(builder);
//须要用户名和密码的认证
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("localhost", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
return new RestHighLevelClient(restClientBuilder);
}
}
3.编写一个操作的对象
@Data
@Document(indexName = "eshop",indexStoreType = "product")
public class Product {
@Id
private String pid;
private String pname;
private double pprice;
}
4.编写接口类继承ElasticsearchRepository
public interface ProductDao extends ElasticsearchRepository<Product,String> {
}
5.控制层的CRUD
@RestController
@RequestMapping
public class ProController {
@Autowired
private ProductDao product;
@RequestMapping("/save")
public String savePro() {
Product product1 = new Product();
product1.setPid("101");
product1.setPname("辣条");
product1.setPprice(6.00);
Product product2 = new Product();
product2.setPid("102");
product2.setPname("饮料");
product2.setPprice(3.00);
product.save(product1);
product.save(product2);
return "存储成功!!!";
}
@RequestMapping("/find")
public Object search01(String pid) {
//QueryBuilders的matchQuery方法进行匹配,可以自定义匹配规则
QueryBuilder queryBuilders = QueryBuilders.matchQuery("pid", pid);
//调用elasticsearch的方法进行搜索
Iterable<Product> iter = product.search(queryBuilders);
return iter;
}
@RequestMapping("/find2")
public Object search02() {
Optional<Product> byId = product.findById("102");
Product product = byId.get();
System.out.println(product);
return "666";
}
@RequestMapping("/find3")
public Object search03() {
Iterator<Product> iterator = product.findAll().iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
return "666";
}
}