初识Elasticsearch
2019-07-17 本文已影响44人
椰子奶糖
Elasticsearch
docker 安装Elasticsearch:
-
docker pull Elasticsearch 下载docker镜像
-
docker images 检查镜像是否存在
-
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 5acf0e8da90b
- 启动镜像:
- -e ES_JAVA_OPTS="-Xms256m -Xmx256m" 设置运行内存最大和最小都是256(我的虚拟机只有2G,而Elasticsearch启动默认会占2G的内存,因此不限制运行内存可能会报错)
- -d 后台运行
- -p 端口映射,9200,9300,其中9300 为分布式的时候各节点主机通信端口
- --name 命名
- 启动镜像:
-
docker pa -a
- 查看镜像运行状态
-
容器运行状态
-
打开web,访问9200端口 ip:9200
-
得到一个如下JSON,安装成功
-
web访问端口:9200
Elasticsearch基本概念
-
JSON
Elasticsearch 使用 JavaScript Object Notation(或者 JSON)作为文档的序列化格式。JSON 序列化为大多数编程语言所支持,并且已经成为 NoSQL 领域的标准格式。 它简单、简洁、易于阅读。
下面这个 JSON 文档代表了一个 user 对象:
user对象
索引和索引
-
存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。
-
一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。
-
前者是动词类似与查找,后者是名词,类似与层次结构、索引,类型、文档关系大约如下:
-
索引类型文档关系图
- 可以看出,这种关系很想数据库中库、表、数据的关系
-
关于两个索引,官方的解释是这样的:
-
官方API
下面来看一条命令
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
- 注意,路径 /megacorp/employee/1 包含了三部分的信息:megacorp索引名称,employee类型名称,1特定雇员的ID
-
类似的检索文档:
GET /megacorp/employee/1
上面的命令结果是返回刚刚存入的JSON,如下:
{ "_index" : "megacorp", "_type" : "employee", "_id" : "1", "_version" : 1, "found" : true, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } }
-
除此之外:
GET /megacorp/employee/_search //查询该类型下的所有员工 GET /megacorp/employee/_search?q=last_name:Smith //查询该类型下的名字为Smith的员工
-
使用表达式搜索:
//表示查询该类型下所有名字为Smith的员工 GET /megacorp/employee/_search { "query" : { "match" : { "last_name" : "Smith" } } } //PS:在Postman中GET没有请求体,所以应当用Post请求在body中加上查询表达式
-
总结:PUT更新文档,GET检索文档,另外Head检查文档是否存在(200表示存在,404表示找不到),DELETE删除文档
Springboot与ES
- springboot默认有两种技术和Elasticsearch交互
-
Jest(默认不生效的)需要导入工具包(io.searchbox.client.JestClient)
-
PUT
//1、给Es中索引(保存)一个文档; Article article = new Article();article.setId(1); article.setTitle("gangtieshizengyangliancheng d"); article.setAuthor("MrChen");article.setContent("gangtieshizheyangliancheng d "); //构建一个索引功能 Index index = new Index.Builder(article).index("mrchen").type("book").build(); try { //执行 jestClient.execute(index); } catch (IOException e){ e.printStackTrace(); }
-
GET
//查询表达式 String json ="{\n" + " \"query\" : {\n" + " \"match\" : {\n" + " \"content\" : \"hello\"\n" + " }\n" + " }\n" + "}"; //更多操作:https://github.com/searchbox-io/Jest/tree/master/jest //构建搜索功能 Search search = new Search.Builder(json).addIndex("mrchen").addType("book").build(); //执行 try { SearchResult result = jestClient.execute(search); System.out.println(result.getJsonString()); } catch (IOException e) { e.printStackTrace(); }
-
-
Spring Data Elasticsearch
-
//继承ElasticsearchRepository<Book,Integer>接口
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
//参照
// https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/
public List<Book> findByBookNameLike(String bookName);
}
//用@Document指定索引,类名
@Document(indexName = "library",type = "book")
public class Book {...}
//自动加载
@Autowired
BookRepository bookRepository;
//则存数据的时候只需将book对象传进去即可
bookRepository.index(book);
//此外bookRepository的方法需要在接口中定义出来,上面接口定义了一个模糊查询的方法:
//具体方法参考官方文档(上面URL即是)
bookRepository.findByBookNameLike("条件")