前期我們已經介紹了Es的安裝,本期将介紹Es的基本概念,與spring boot的整合使用。 簡介 Elasticsearch是基于Lucene的全文檢索庫,本質也是存儲資料,很多概念與MySQL類似。對比關系如下:
索引(indices)--------------------------------Databases 資料庫 類型(type)-----------------------------Table 資料表 文檔(Document)----------------Row 行 字段(Field)-------------------Columns 列
Elasticsearch中支援的資料類型非常豐富:
幾個關鍵常用的:
- String類型,又分兩種:
- text:可分詞,不可參與聚合
- keyword:不可分詞,資料會作為完整字段進行比對,可以參與聚合
- Numerical:數值類型,分兩類
- 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子後存儲,取出時再還原。
- 基本資料類型:long、interger、short、byte、double、float、half_float
- 浮點數的高精度類型:scaled_float
-
Date:日期類型
elasticsearch可以對日期格式化為字元串存儲,但是建議我們存儲為毫秒值,存儲為long,節省空間。
Elasticsearch叢集相關概念:
- 索引集(Indices,index的複數):邏輯上的完整索引 collection1
- 分片(shard):資料拆分後的各個部分
- 副本(replica):每個分片的複制
要注意的是:Elasticsearch本身就是分布式的,是以即便你隻有一個節點,Elasticsearch預設也會對你的資料進行分片和副本操作,當你向叢集添加新資料時,資料也會在新加入的節點中進行平衡。
Es的增删改查
使用kibana的控制台操作,可以對http請求進行簡化 1. 建立索引和映射關系
PUT /索引庫名/_mapping/類型名稱{ "properties": { "字段名": { "type": "類型", "index": true, "store": true, "analyzer": "分詞器" } }}
- 類型名稱:就是前面type的概念,類似于資料庫中的不同表字段名:任意填寫,可以指定許多屬性,例如:
- type:類型,可以是text、long、short、date、integer、object等
- index:是否索引,預設為true
- store:是否存儲,預設為false
- analyzer:分詞器,這裡的ik_max_word即使用ik分詞器
demo:
檢視映射關系
GET /索引庫名/_mapping
2.新增資料
POST /索引庫名/類型名/id值 ##id值可以自己指定,也可以由es自動生成{ "key":"value"}
demo:
檢視剛剛插入的資料:
get _search{ "query":{ "match_all":{} }}
3.修改資料 把剛才新增的請求方式改為PUT,就是修改了。不過修改必須指定id
- id對應文檔存在,則修改
- id對應文檔不存在,則新增
PUT /majiang/user/1{ "name":"diku", "age":19, "images":"http://image.majiang.com/diku.jpg"}
4.删除資料
DELETE /索引庫名/類型名/id值
5.查詢資料
5.1查詢所有
GET /majiang/_search{ "query":{ //查詢對象 "match_all": {} //代表查詢所有 }}
5.2比對查詢
GET /majiang/_search{ "query":{ "match":{ "age":19 } }}
結果:
- 更多相關進階的操作體驗請上官方開發文檔https://www.elastic.co/guide/index.html
與Springboot的整合
1.添加pom依賴
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency><dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-elasticsearchartifactId>dependency><dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> <optional>trueoptional>dependency><dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId>dependency>
2.配置application.yml檔案
server: port: 8080spring: data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 192.168.9.120:9300
3.建立啟動器
@SpringBootApplicationpublic class EsApp { public static void main(String[] args) { SpringApplication.run(EsApp.class,args); }}
4.建立實體類User
@Data@Document(indexName = "majiang" ,type="user")public class User { private String id; private String name; private int age; private String images; public User() { } public User(String id, String name, int age, String images) { this.id = id; this.name = name; this.age = age; this.images = images; }}
5.建立EsRepository
@Repositorypublic interface EsRepository extends ElasticsearchRepository<User,String> {}
為了簡化操作就沒有建立controller、serviceImpl等,通過@SpringBootTest進行示範操作。
6.UserService具體操作
通過ElasticsearchTemplate 和ElasticsearchRepository 來操作。
@RunWith(SpringRunner.class)@SpringBootTestpublic class UserService { private static final Logger log = LoggerFactory.getLogger(UserService.class); @Autowired private ElasticsearchTemplate elasticsearchTemplate; @Autowired private EsRepository esRepository; /** * 查詢所有 */ @Test public void getAll() { esRepository.findAll().forEach(a -> { log.info(String.valueOf(a)); }); //使用elasticsearchTemplate 構造NativeSearchQueryBuilder對象 SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(null).build(); List users = elasticsearchTemplate.queryForList(searchQuery, User.class); users.forEach(user -> { log.info(user.toString()); } ); } /** * 通過id查詢 */ @Test public void findById() { log.info(String.valueOf(esRepository.findById("1"))); } /** * 新增 */ @Test public void insUser() { esRepository.save(new User("6", "cccc", 26, "http://image.majiang.com/cccc.jpg")); //使用elasticsearchTemplate 構造IndexQuery對象 User cccc = new User("8", "oooo", 29, "http://image.majiang.com/oooo.jpg"); IndexQuery indexQuery = new IndexQueryBuilder().withObject(cccc).build(); elasticsearchTemplate.index(indexQuery); } /** * 修改 */ @Test public void updUser() { esRepository.save(new User("6", "cccc", 29, "http://image.majiang.com/cccc.jpg")); } /** * 删除 */ @Test public void delUser() { esRepository.deleteById("6"); }}
查詢所有getAll()的執行結果
總結
本篇簡單介紹了Elasticsearch的基本操作,Spring boot整合Es的兩種方式ElasticsearchTemplate,ElasticsearchRepository。