Document可以看作表中的一条记录,Index可以看作Database数据库,而Type就是里面的Table表。
一、依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、在application.properties文件中添加ElasticSearch连接信息
server.port=8080
#es 配置信息
spring.main.allow-bean-definition-overriding=true
elasticsearch.host=127.0.0.1
elasticsearch.port=9300
elasticsearch.clustername=elasticsearch
elasticsearch.search.pool.size=5
启动类
@SpringBootApplication
public class SSD08Application {
public static void main(String[] args) {
SpringApplication.run(SSD08Application.class, args);
}
}
三、创建Elasticsearch配置类
@Slf4j
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.yoodb.study.demo08.service")
public class ElasticsearchConfig{
@Value("${elasticsearch.host}")
private String esHost;
@Value("${elasticsearch.port}")
private int esPort;
@Value("${elasticsearch.clustername}")
private String esClusterName;
@Value("${elasticsearch.search.pool.size}")
private Integer threadPoolSearchSize;
@Bean
public Client client() throws Exception{
Settings esSettings = Settings.builder()
.put("cluster.name",esClusterName)
.put("client.transoprt.sniff",true)
.put("thread_pool.search.size",threadPoolSearchSize)
.build();
return new PreBuiltTransportClient(esSettings)
.addTransoprtAddress(new TransportAddress(InetAddress.getByName(esHost), esPort));
}
@Bean(name="elasticsearchTemplate")
public ElasticsearchOperations elasticsearchTemplateCustom() throws Exception {
ElasticsearchTemplate elasticsearchTemplate;
try{
elasticsearchTemplate = new ElasticsearchTemplate(client());
return elasticsearchTemplate;
}catch(Exception e){
return new ElasticsearchTemplate(client());
}
}
}
四、创建Article实体类
- @Document 作用在类,标记实体类为文档对象,一般有两个属性
indexName:对应索引库名称
type:对应在索引库中的类型
shards:分片数量,默认分5片
replicas:副本数量,默认1份
- @Id 作用在成员变量,标记一个字段作为id主键
- @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性
type:字段类型,取值是枚举:FieldType
index:是否索引,布尔类型,默认是true
store:是否存储,布尔类型,默认是false
analyzer和searchAnalyzer中参数名称保持一直,ik_max_word可以改成ik_smart
ik_max_word和ik_smart的区别?
- ik_max_word参数采用穷尽式的分词,比如“我爱家乡”,可能会分出“我”,“我爱”,“家乡”等
- ik_smart参数分的会比较粗,如上语句可能会分出“我爱”,“家乡”这样
如果想要搜索出的结果尽可能全,可以使用ik_max_word参数,如果需要结果尽可能精确,可以使用ik_smart参数
Document(indexName = "blog",type = "article")
public class Article {
/**
* 主键ID
*/
@Field(type = FieldType.Keyword)
private String id;
/**
* 文章标题
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
private String title;
/**
* 文章内容
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
private String content;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
五、继承ElasticsearchRepository接口
public interface ElasticRepository extends ElasticsearchRepository<Article, String> {
}
六、IElasticService接口以及实现类
public interface IElasticService {
public void save(Article article);
public void saveAll(List<Article> list);
public Iterator<Article> findAll();
public List<Article> findArticleByTitle(String title);
}
@Service("elasticService")
public class ElasticServiceImpl implements IElasticService {
@Autowired
private ElasticRepository elasticRepository;
@Override
public void save(Article article) {
elasticRepository.deleteAll();
elasticRepository.save(article);
}
@Override
public void saveAll(List<Article> list) {
elasticRepository.saveAll(list);
}
@Override
public Iterator<Article> findAll() {
return elasticRepository.findAll().iterator();
}
public List<Article> findArticleByTitle(String title) {
//matchQuery 对关键字分词后进行搜索
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", title);
QueryBuilders.commonTermsQuery("title",title);
Iterable<Article> search = elasticRepository.search(matchQueryBuilder);
Iterator<Article> iterator = search.iterator();
List<Article> list = new ArrayList<>();
while (iterator.hasNext()){
Article next = iterator.next();
list.add(next);
}
return list;
}
}
七、控制层Controller
@Log4j2
@RestController
@RequestMapping("/elastic")
public class ElasticController {
@Autowired
private IElasticService elasticService;
@GetMapping("/init")
public void init(){
String title = "关注“Java精选”微信公众号";
String content = "Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架" +
"(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、" +
"数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及" +
"优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习" +
"和工作有所帮助。";
Article article = createArticle(title, content);
elasticService.save(article);
title = "关注素文宅博客";
content = "素文宅博客主要关于一些Java技术类型文章分享。";
article = createArticle(title, content);
List<Article> list = new ArrayList<>();
list.add(article);
elasticService.saveAll(list);
}
public static Article createArticle(String title,String content){
UUID uuid = UUID.randomUUID();
String id = uuid.toString();
Article article = new Article();
article.setId(id);
article.setTitle(title);
article.setContent(content);
return article;
}
@GetMapping("/all")
public Iterator<Article> all(){
return elasticService.findAll();
}
@GetMapping("/key")
public List<Article> all(String title){
return elasticService.findArticleByTitle(title);
}
}
运行程序
1)启动ElasticSearch服务
2)启动SpringBoot项目访问地址
初始化生成索引文件访问地址
http://localhost:8080/elastic/init
获取所有索引内容访问地址
http://localhost:8080/elastic/all
[{"id":"62e73653-4658-4d72-9b2e-e541a3ae7d53","title":"关注“Java精选”微信公众号","content":"Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。"},{"id":"1e7c2f0b-e07e-4037-a3a3-3385d8b7d2c1","title":"关注素文宅博客","content":"素文宅博客主要关于一些Java技术类型文章分享。"}]
根据搜索条件,获取索引内容访问地址
http://localhost:8080/elastic/key?title=Java%E7%B2%BE%E9%80%89
返回结果:
[{"id":"62e73653-4658-4d72-9b2e-e541a3ae7d53","title":"关注“Java精选”微信公众号","content":"Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。"}]