1.引入依赖与配置
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
spring:
application:
name: tensquare-search
data:
elasticsearch:
cluster-nodes: 192.168.217.136:9300 // 使用java等第三方操作时es的端口为9300,自身客户端操作端口为9200
2.将实体类保存到索引库
package com.tensquare.search.pojo;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import java.io.Serializable;
// 区域
@Document(indexName = "tensquare_article", type = "article")
public class Article implements Serializable {
@Id
private String id;
//是否索引,就是看该域是否能被搜索。
//是否分词,就表示搜索的时候是整体匹配还是单词匹配
//是否存储,就是是否在页面上显示
@Field(index = true, analyzer="ik_max_word", searchAnalyzer="ik_max_word")
private String title;
@Field(index = true, analyzer="ik_max_word", searchAnalyzer="ik_max_word")
private String content;
private String state;//审核状态
// ... 省略s/getter
}
3.控制层
package com.tensquare.search.controller;
import com.tensquare.search.pojo.Article;
import com.tensquare.search.service.ArticleService;
import entity.PageResult;
import entity.Result;
import entity.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/article")
@CrossOrigin
public class ArticleController {
@Autowired
private ArticleService articleService;
@RequestMapping(method = RequestMethod.POST)
public Result save(@RequestBody Article article){
articleService.save(article);
return new Result(true, StatusCode.OK, "添加成功");
}
@RequestMapping(value = "/{key}/{page}/{size}", method = RequestMethod.GET)
public Result findByKey(@PathVariable String key, @PathVariable int page, @PathVariable int size){
Page<Article> pageData = articleService.findByKey(key, page, size);
return new Result(true, StatusCode.OK, "查询成功", new PageResult<Article>(pageData.getTotalElements(), pageData.getContent()));
}
}
其他就是服务层的简单查询与dao调用,略。
可以发现,es针对实体类Article使用@Document(indexName = “tensquare_article”, type = “article”)标注该类为搜索服务类,indexName 为索引区,type 为区内搜索子域,使用@Field()注释该字段是否可被搜索等属性。
4.在docker中安装运行es
docker run -di --name=tensquare_es -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
测试访问docker中的es:
访问-> http://192.168.74.130:9200/
访问-> http://192.168.74.130:9300/ 会发现无法访问。
解决:进入docker容器修改es的配置文件,使用命令:
docker exec -it tensquare_elasticsearch /bin/bash
值得注意的是,进入docker容器并进入到es的配置目录config下,找到.yml文件是无法使用 vi 命令操作文件的,需要让其挂载到宿主机上,故需要先复制一份配置文件。
我们继续(先exit):
docker cp tensquare_es:/usr/share/elasticsearch/config/elasticsearch.yml /usr/share/elasticsearch.yml
将 transport这行注释打开
退出编辑并保存 esc->shift z z
继续修改/etc/security/limits.conf
vi /etc/security/limits.conf 允许单个进程打开的最大文件个数
追加内容:
soft nofile 65536
hard nofile 65536
修改/etc/sysctl.conf,追加内容,限制一个进程可拥有的虚拟内存数量
vm.max_map_count=655360
执行 sysctl -p 使其立即生效
重新启动容器或 reboot 整个虚拟机