From ad01920ddfc3e84df39a70fc9d2c0708f111b441 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Tue, 6 Jul 2021 11:50:18 +0800 Subject: [PATCH] =?UTF-8?q?perf[zapp]:=20=E6=96=B0=E5=A2=9E=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/elastic/elastic-search-command.md | 806 ++++++++++++++++++ doc/elastic/elastic-search-setup.md | 83 ++ doc/elastic/elastic-search.md | 14 + .../zfoo/orm/cache/guava/GuavaCacheTest.java | 87 ++ 4 files changed, 990 insertions(+) create mode 100644 doc/elastic/elastic-search-command.md create mode 100644 doc/elastic/elastic-search-setup.md create mode 100644 doc/elastic/elastic-search.md create mode 100644 orm/src/test/java/com/zfoo/orm/cache/guava/GuavaCacheTest.java diff --git a/doc/elastic/elastic-search-command.md b/doc/elastic/elastic-search-command.md new file mode 100644 index 00000000..6189b490 --- /dev/null +++ b/doc/elastic/elastic-search-command.md @@ -0,0 +1,806 @@ +# 一、索引管理 + +- es所有的命令都是通过http完成的 + +- es的和传统的数据库对于规则如下: + +``` +db es +数据库 索引 +表 类型type +行 文档document +列 字段field +表结构schema 映射mapping +索引 全文索引 +sql http接口 +``` + +- Text:会分词,然后进行索引,支持模糊、精确查询,不支持聚合 + +- keyword: 不分词,直接索引,支持模糊、精确查询,支持聚合 + +## 1.索引的增加 + +- put blog,索引必须全部小写,es7过后取消type概念,默认为_doc + +```json +{ + "settings": { + "number_of_shards": 1 + }, + "mappings": { + "properties": { + "id": { + "type": "long" + }, + "content": { + "type": "text" + }, + "postTime": { + "type": "date" + }, + "title": { + "type": "text" + } + } + } +} +``` + +## 2.删除 + +- delete blog +- 全部删除 + +``` +curl -X DELETE http://localhost:9200/_all +``` + +## 3.改 + +- put blog/_settings + +```json +{ + "blocks.read": true +} +``` + +``` +blocks.read,禁止对当前索引进行读操作 +blocks.read_only,只允许读,不允许写 +blocks.write,禁止写操作 +``` + +- put blog/_mappings + +```json +{ + "properties": { + "id": { + "type": "text" + }, + "content": { + "type": "text" + }, + "postTime": { + "type": "date" + }, + "title": { + "type": "text" + }, + "aaa": { + "type": "text" + } + } +} +``` + +## 4.查 + +- 查询全部的索引 + +``` +curl -X GET http://localhost:9200/_cat/indices +``` + +- get blog/_settings +- get blog/_mappings + +## 5.索引打开和关闭 + +- post blog/_close,已经关闭的索引不能进行任何读写操作 +- post blog/_open + +- post _all/_close +- post _all/_open,全部打开 + +# 二、文档管理 + +## 1.增加文档 + +- put blog/_doc/1,index/type/id + +```json +{ + "id": 1, + "title": "Java讲义", + "postTime": "2019-06-09", + "content": "全功能的一门编程语言" +} +``` + +- post blog/_doc,这种方式id会随机生成 + +```json +{ + "id": 3, + "title": "Java讲义3", + "postTime": "2019-06-09", + "content": "全功能的一门编程语言3" +} +``` + +## 2.修改文档 + +- put blog/_doc/1 + +```json +{ + "title": "Java讲义bbb", + "postTime": "2019-06-09", + "content": "全功能的一门编程语言bbb" +} +``` + +## 3.删除文档 + +- delete blog/_doc/1 + +## 4.查询文档 + +- get blog/_doc/1 + +## 5.路由机制 + +- shard = hash(routing) % shard_num + +``` +routing默认为文档id,也可以指定routing,这样可以避免查询的时候广播查询,如下 +get blog/article/1?routing=jay,routing值固定的话,可以让查询集中在一个片上 +``` + +# 三、映射 + +- get blog/_mapping,查看映射信息,默认是动态映射 + +- put blog,创建索引时就添加静态映射,添加更精准,更详细的配置信息 + +``` +boost为权重权重,默认为1 +format匹配的格式 +keyword不会被分词,ignore_above和keyword一起使用,指定分词和索引的最大长度,超过的部分不会被索引 +index是否进行到排序索引,false不进行索引,也就不可搜索,默认开启,动态mapping解析出来为数字类型、布尔类型的字段除外 +doc_values默认开启,会增加一个列存储索引,对于不需要排序和聚合的字段可以关闭 +similarity默认使用BM25评分模型 +{ + "settings": { + "number_of_shards": 1 + }, + "mappings": { + "properties": { + "id": { + "type": "long" + }, + "title": { + "type": "keyword", + "ignore_above": 20 + }, + "content": { + "type": "text", + "boost": 2, + "analyzer": "ik_max_word", + "search_analyzer": "ik_smart" + }, + "postTime": { + "type": "date", + "format": "yyyy-MM-dd HH:mm:ss", + "doc_values": true, + "index": false + } + } + } +} +``` + +- post _bulk,批量插入,一个document必须在一行,而且还要换行,下面的结构不要改 + +``` +{"index":{ "_index": "blog", "_type": "_doc", "_id": "1" }} +{"id": 1, "title": "Java讲义", "postTime": "2017-06-09 12:30:00", "content": "全功能的一门编程语言,既可以做前端,也可以做后端"} + +{"index":{ "_index": "blog", "_type": "_doc", "_id": "2" }} +{"id": 2, "title": "精通C#", "postTime": "2018-06-09 12:30:00", "content": "大部分用来在windows上做前端"} + +{"index":{ "_index": "blog", "_type": "_doc", "_id": "3" }} +{"id": 3, "title": "Go实战", "postTime": "2019-06-09 12:30:00", "content": "Google全力主推的一门语言"} + +``` + +# 四、复杂查询 + +- get/post,blog/_search或者/_search查询全部 + +```json +{ + "query": { + "match_all": {} + } +} +``` + +- get,/_search,分页查询,_source指定需要返回的字段,version默认不返回,min_score过滤最低的分数,highlight高亮显示,不指定sort默认用评分排序 + +```json +{ + "from": 0, + "size": 100, + "query": { + "term": { + "content": "前端" + } + }, + "_source": [ + "title", + "content" + ], + "version": true, + "min_score": 0.6, + "highlight": { + "fields": { + "content": { + "pre_tags": [ + "" + ], + "post_tags": [ + " listener = new RemovalListener() { + public void onRemoval(RemovalNotification notification) { + System.out.println("[" + notification.getKey() + ":" + notification.getValue() + "] is removed!"); + + // 采用LRU算法,所以最后会移除key1 + Assert.assertEquals(notification.getKey(), "key1"); + Assert.assertEquals(notification.getValue(), "value1"); + } + }; + Cache cache = CacheBuilder.newBuilder() + .maximumSize(3) + .removalListener(listener) + .build(); + cache.put("key1", "value1"); + cache.put("key2", "value2"); + cache.put("key3", "value3"); + cache.put("key4", "value4"); + } + + @Test + public void timeRemovedTest() { + // 基于过期时间的策略不会回调这个remove方法 + Cache cache = CacheBuilder.newBuilder() + .expireAfterAccess(10, TimeUnit.SECONDS) + .refreshAfterWrite(5, TimeUnit.SECONDS) + .removalListener(new RemovalListener() { + public void onRemoval(RemovalNotification notification) { + System.out.println("[" + notification.getKey() + ":" + notification.getValue() + "] is removed!"); + } + }) + .build(new CacheLoader() { + public String load(String key) { + System.out.println("load by " + Thread.currentThread().getName()); + return "newValue"; + } + + @Override + public ListenableFuture reload(String key, String oldValue) { + System.out.println("reload by " + Thread.currentThread().getName()); + return Futures.immediateFuture("newValue"); + } + }); + + cache.put("key1", "value1"); + + Assert.assertEquals(cache.getIfPresent("key1"), "value1"); + ThreadUtils.sleep(5000); + Assert.assertEquals(cache.getIfPresent("key1"), "newValue"); + } + + +}