elasticsearch入门篇-学习笔记
介绍
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
原理
Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式.如下:
Elasticsearch和传统关系型数据库对比如下:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
Elasticsearch最关键的就是提供强大的索引能力,
如果我们插入这几条数据:
ID | title | content |
---|---|---|
1 | 咒术回战 | 打妖怪 |
2 | 钢之炼金术师 | 人体试炼 |
3 | 进击的巨人 | 打妖怪 |
Elasticsearch会建立这些索引:
title:
Term | Posting List |
---|---|
咒术回战 | 1 |
钢之炼金术师 | 2 |
进击的巨人 | 3 |
content:
Term | Posting List |
---|---|
打妖怪 | [1,3] |
人体试炼 | 2 |
Posting list就是一个int的数组,存储了所有符合某个term的文档id
直接通过内存读取term,不读取磁盘,但不是简单的讲所有的term放在内存
关于Lucene的词典FST深入剖析 这篇文章对索引原理讲的很清晰
本地安装
https://www.elastic.co/cn/elasticsearch/官网下载zip包.
注意最新版本需要jdk版本11,我使用的6.0.0版本对应jdk版本8
解压,点击bat文件
表示启动成功,在网页上可以通过http://localhost:9200/访问
Java API操作
在idea创建工程,导入依赖:
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
创建文档,搜索文档
创建文档:
@Test
public void createIndex() throws Exception {
//1.创建es客户端对象
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress
.getByName("127.0.0.1"), 9300));
//2.创建文档内容
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 1)
.field("title", "elasticsearch是一个基于lucene的搜索服务")
.field("content", "ElasticSearch是一个基于Lucene的搜索服务器。" +
"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" +
"Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布," +
"是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," +
"可靠,快速,安装使用方便。")
.endObject();
//3.创建文档对象
IndexResponse response = transportClient.prepareIndex("blog1", "article", "1")
.setSource(contentBuilder)
.get();
Map<String,Object> map = new HashMap<String, Object>();
map.put("id","2");
map.put("title","这是一个基于lucene的搜索服务");
map.put("content","这是一个基于Lucene的搜索服务器文件");
//3.创建文档对象
IndexResponse response2 = transportClient.prepareIndex("blog1", "article", "2")
.setSource(map)
.get();
//获取返回的状态
RestStatus status = response.status();
System.out.println(status);
//4.释放资源
transportClient.close();
}
搜索所有的数据
@Test
public void searchAll() throws Exception{
//1创建客户端对象
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).
addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//2.构建搜索内容
SearchResponse response = transportClient.prepareSearch("blog1").setTypes("article")
.setQuery(QueryBuilders.matchAllQuery())
.get();
//获取搜索结果
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
//遍历结果
Iterator<SearchHit> iterator = hits.iterator();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//关闭资源
transportClient.close();
}
可直接通过postman增删改查,效果
put表示插入,修改
get请求表示查询,
delete请求表示删除
插入:
查询:
根据条件查询:
删除:
啾咪啾咪