本文共 7547 字,大约阅读时间需要 25 分钟。
Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用了ElasticSearch作为其搜索服务,
启动 elasticsearch容器:
# 拉取镜像# docker pull elasticsearch:2.4.0# 启动 elasticsearch 容器# docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -di -p 9200:9200 -p 9300:9300 --name es01 elasticsearch:2.4.0
若开启了防火墙,记得开放 9200 和 9300 端口
查看已经开放的端口# firewall-cmd --list-ports 开启端口# firewall-cmd --zone=public --add-port=80/tcp --permanent # –zone #作用域# –add-port=80/tcp #添加端口,格式为:端口/通讯协议# –permanent #永久生效,没有此参数重启后失效 重启firewall # firewall-cmd --reload
启动容器后:在浏览器中输入 elasticsearch 安装的容器所在的服务器的 ip:9200
elasticsearch 通过restful api 的方式来操作:
将HTTP命令由puT改为GET可以用来检索文档,同样的,可以使用DELETE命令来删除文档,以及使用HEAD指令来检查文档是否存在。如果想更新已存在的文档,只需再次PUT。
例:
PUT ip:9200/megacorp/employee/1
{ "username":"superzheng", "password":"密码"}
GET ip:9200/megacorp/employee/1
或者搜索:
GET ip:9200/megacorp/employee/_search?q=last_name:Smith
通过json数据体搜索:
POST ip:9200/megacorp/employee/_search
# match 为模糊匹配 last_name 为字段 Smith为匹配值# 将 match 改为 match_phrase 为完全匹配{ "query":{ "match":{ "last_name":"Smith" } }}
通过json数据体高级搜索:
POST ip:9200/megacorp/employee/_search
# 匹配 姓名为 smith 的并且年龄必须大于 30 的{ "query":{ "bool":{ "must":{ "match":{ "1ast_name":"Smith" } }, "filter":{ "range":{ "age":{ "gt":30} } } } }, "highlight":{ "fields":{ "about" : { } } }}
导入 jest 需要的jar 包:
io.searchbox jest 5.3.3
实体类(用到了 lombok)
@ToString@Builder@AllArgsConstructor@NoArgsConstructor@Getter@Setterpublic class Article { /** * 标识这是主键 */ @JestId private Long id; private String author; private String title; private String content;}
@ToString@Builder@AllArgsConstructor@NoArgsConstructor@Getter@Setter@Document(indexName = "mesmile", type = "book") // indexName 索引名 type 类型public class Book { private Long id; private String bookName; private String author;}
测试elasticsearch 的存储与搜索
package cn.mesmile.springboot.elastic;import cn.mesmile.springboot.elastic.domain.Article;import cn.mesmile.springboot.elastic.domain.Book;import cn.mesmile.springboot.elastic.repository.BookRepository;import io.searchbox.client.JestClient;import io.searchbox.core.Index;import io.searchbox.core.Search;import io.searchbox.core.SearchResult;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;import java.util.List;@RunWith(SpringRunner.class)@SpringBootTestpublic class ElasticApplicationTests { /** * 对 elasticsearch 进行操作有两种方式 * * 方式 ① jest 的方式 * 方式① 需要导入 jar 包 * ** * * 方式 ② springdataes 的方式,需要继承 ElasticsearchRepositoryio.searchbox *jest *5.3.3 *接口 T为实体类,D为实体类主键类型 * * 注意 springboot 版本 和 elasticsearch 版本 匹配 * 【记得没错此依赖只针对的是6.0版本以上ES,6.0版本以下ES不适用于SpringBoot的依赖。】 * 这里选用的是【 springboot:1.5.9 elasticsearch:2.4.0】 */ @Autowired private JestClient jestClient; @Autowired private BookRepository bookRepository; /** * jest 的方式对 elasticsearch 进行展示 */ @Test public void contextLoads() { Article article = Article.builder() .id(1L) .author("superzheng") .title("通知") .content("今天项目上线了") .build(); // 构建一个索引 保存什么 保存在哪 类型是什么 Index index = new Index.Builder(article).index("mesmile").type("news").build(); try { // 执行 // 执行成功后再网址验证查询 ip:9200/mesmile/news/1 jestClient.execute(index); /* 结果如下: { "_index": "mesmile", "_type": "news", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "author": "superzheng", "title": "通知", "content": "今天项目上线了" } } */ } catch (IOException e) { e.printStackTrace(); } } @Test public void testSearch() { String json = "{\n" + " \"query\":{\n" + "\t\t\"match\":{\n" + "\t\t\t\"content\":\"项目\"\n" + " }\n" + " }\n" + "}"; // 构建搜索 Search search = new Search.Builder(json).addIndex("mesmile").addType("news").build(); try { // 执行搜索 SearchResult result = jestClient.execute(search); // 生成 json 字符串 System.out.println(result.getJsonString()); // 搜索并转换成我们需要的 Article sourceAsObject = result.getSourceAsObject(Article.class,true); System.out.println(sourceAsObject); } catch (IOException e) { e.printStackTrace(); } /* { "took": 58, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.5716521, "hits": [{ "_index": "mesmile", "_type": "news", "_id": "1", "_score": 0.5716521, "_source": { "id": 1, "author": "superzheng", "title": "通知", "content": "今天项目上线了" } }] } } */ } /** * repository的方式 */ @Test public void testBook() { Book book = Book.builder() .id(1L) .bookName("红楼梦") .author("曹雪芹") .build(); // 存储数据 bookRepository.index(book); } @Test public void testSearchLike() { // 模糊查询 List data = bookRepository.findByBookNameLike("楼"); data.forEach(System.out::println); }}
NoNodeAvailableException[None of the configured nodes are available: [{ #transport#-1}{ BCBUirWrTIy-RJ5ZnNj3xA}{ 40.100.00.200}{ 40.100.00.200:9300}]]org.springframework.boot spring-boot-starter-data-elasticsearch
项目配置文件
# 9200作为Http协议,主要用于外部通讯#9300作为Tcp协议,jar之间就是通过tcp协议通讯#ES集群之间是通过9300进行通讯#9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口(各种CRUD操作都是走的该端口,如查询:http://localhost:9200/user/_search)。#9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。(java程序中使用ES时,在配置文件中要配置该端口)spring: elasticsearch: jest: uris: http://40.100.00.200:9200 data: elasticsearch: cluster-nodes: 40.100.00.200:9300 # 默认名称是 elasticsearch 通过 ip:9200 查看 cluster-name: elasticsearch
转载地址:http://qqxxi.baihongyu.com/