首先,确保已经正确启动了Elasticsearch服务器,windows系统运行Elasticsearch解压文件下的bin/elasticsearch.bat文件(linux系统运行bin/elasticsearch文件)即可。
运行成功后,在浏览器中访问http://localhost:9200,查看是否启动成功,启动成功结果如下:
{
"name" : "Rg9hQgw", // 默认的节点名称
"cluster_name" : "elasticsearch", // 默认的集群名称
"cluster_uuid" : "phE0-t5oTCqeX8XIYsd1Tw",
"version" : {
"number" : "6.6.1",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "1fd8f69",
"build_date" : "2019-02-13T17:10:04.160291Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
#Elasticsearch 服务地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
#设置连接超时时间
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s
这里一定要把端口号改为9300。9300 是 Java 客户端的端口,9200 是支持 Restful HTTP 的接口,这两个在使用中应注意区分。
这里我创建了一个简单的博客类EsBlog,专门用于在ES中存储博客文档。代码如下:
package com.minproject.easynews.model.ES;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
/**
* created time: 2019/03/12 17:57
* author AmyZhang
**/
@Document(indexName = "blogtest", type = "blogtest")
public class EsBlog implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
private String title;
private String summary;
private String content;
// JPA的规范要求无参构造函数;设置为protected防止直接使用
protected EsBlog() {}
public EsBlog(String title, String summary, String content) {
this.title = title;
this.content = content;
this.summary = summary;
}
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 getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return String.format("User[id='%s', title='%s', summary='%s', content='%s']",
id, title, summary, content);
}
}
在ES中,主键id采用的是String类型。
package com.minproject.easynews.utils;
import com.minproject.easynews.model.ES.EsBlog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
* created time: 2019/03/14 13:46
* author AmyZhang
**/
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String> {
Page<EsBlog> findByTitleOrSummaryOrContent(String title, String summary,String content, Pageable pageable);
// 以下为错误代码
//Page findByTitleContainningOrSummaryContainningOrContentContainning(String title, String summary,String content, Pageable pageable);
}
这里,最初做的时候存在对Repository不了解,只是从别的地方找来代码直接用,可能借鉴的代码使用版本与我的版本存在差异,导致项目总是报错,错误提示主要为Caused by: org.springframework.data.mapping.PropertyReferenceException: No property containning found for type String! Traversed path: EsBlog.summary.
,或者failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available
,我找了好久不知道问题出在哪里。后来终于在网上找到一篇能解决我这个问题的帖子,将错误的字段名引用去掉后,项目终于能运行了。虽然过程很辛酸,但最终还是解决了,很开心,感谢广大网友。
package com.minproject.easynews;
import com.minproject.easynews.model.ES.EsBlog;
import com.minproject.easynews.utils.EsBlogRepository;
import org.elasticsearch.index.query.QueryBuilder;
import org.junit.Before;
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.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Optional;
/**
* created time: 2019/03/14 13:56
* author AmyZhang
**/
@RunWith(SpringRunner.class)
@SpringBootTest
public class EsBlogRepositoryTest {
@Autowired
private EsBlogRepository esBlogRepository;
@Before
public void initRepositoryData() {
// 清除所有数据
esBlogRepository.deleteAll();
// 初始化数据
esBlogRepository.save(new EsBlog("青海黄南州泽库县发生4.3级地震 网友:兰州有震感",
"青海黄南州泽库县发生4.3级地震 网友:兰州有震感",
"#地震快讯#中国地震台网正式测定:03月14日13时32分在青海黄南州泽库县(北纬34.97度,东经101.83度)" +
"发生4.3级地震,震源深度10千米。"));
esBlogRepository.save(new EsBlog("演技脱胎换骨!吴昕新剧首演“御姐腹黑女”获赞:挺带感",
"电视剧《爱上北斗星男友》是一部甜甜的网剧,讲述了一位从北斗星来的天星师,到地球来寻找初恋情人姞婉," +
"但是在次过程中遇到姞婉能量重组后的“水逆”女制作人文素汐,由此莫名其妙卷入一场娱乐圈纷争的搞笑故事。",
"该剧请来了徐璐和张铭恩为男女主角,同时湖南卫视主持人吴昕也倾力加盟,让大家倍感期待。从3月13日开播以来," +
"该剧的口碑不断发酵,不仅徐璐和张铭恩的对手戏非常甜腻。另外一个亮点就是吴昕了,吴昕此次在剧中饰演了蔡舒萌," +
"一个与女主角一样职业的女制片人。作为女二号,自然是演绎的奸角,这次反而让大家看到了吴昕演技脱胎换骨。"));
esBlogRepository.save(new EsBlog("吴昕新剧演技大翻转 确实进步不少",
"说起吴昕想必大家都已经很熟悉了吧?是《快本》的主持人,一直以为她非常的快乐、简单,但是看过" +
"《我家那闺女》才知道,原来她也有那么多的心事,原来她也很自卑," +
"觉得自己做的不好,原来她也是一个十分敏感的小女孩,她也一直在努力,希望能做的好。",
"除了她的主持能力经常被拿来说,另外一个,大概就是演技了。吴昕出演过得电视剧和电影并不多,不出意外的是" +
",每一部电视剧中,她的演技都要被批评。比如《倾世皇妃》中的小侍女,《深夜食堂》里的的小姑娘," +
"还有快乐家族一起出演的电影中的角色。这些角色给吴昕带来的评价大概就是:没有演技,就回去主持吧。"));
}
@Test
public void testFindDistinctEsBlogTitleOrSummaryOrContent() {
Pageable pageable = PageRequest.of(0, 20);
String title = "吴昕";
String summary = "新剧";
String content = "地震";
Page<EsBlog> page = esBlogRepository.findByTitleOrSummaryOrContent(title,
summary, content, pageable);
System.out.println("-------------start 1");
for (EsBlog blog : page) {
System.out.println(blog.toString());
}
System.out.println("-------------end 1");
title = "地震";
summary = "吴昕";
content = "地震";
page = esBlogRepository.findByTitleOrSummaryOrContent(title,
summary, content, pageable);
System.out.println("-------------start 2");
for (EsBlog blog : page) {
System.out.println(blog.toString());
}
System.out.println("-------------end 2");
}
}
其中Pageable pageable = PageRequest.of(0, 20);
是初始化一个分页请求。
执行结果如下:
-------------start 1
User[id='qCYSfGkBd9vIDaEfVme5', title='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', summary='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', content='#地震快讯#中国地震台网正式测定:03月14日13时32分在青海黄南州泽库县(北纬34.97度,东经101.83度)发生4.3级地震,震源深度10千米。']
User[id='qiYSfGkBd9vIDaEfV2eZ', title='吴昕新剧演技大翻转 确实进步不少', summary='说起吴昕想必大家都已经很熟悉了吧?是《快本》的主持人,一直以为她非常的快乐、简单,但是看过《我家那闺女》才知道,原来她也有那么多的心事,原来她也很自卑,觉得自己做的不好,原来她也是一个十分敏感的小女孩,她也一直在努力,希望能做的好。', content='除了她的主持能力经常被拿来说,另外一个,大概就是演技了。吴昕出演过得电视剧和电影并不多,不出意外的是,每一部电视剧中,她的演技都要被批评。比如《倾世皇妃》中的小侍女,《深夜食堂》里的的小姑娘,还有快乐家族一起出演的电影中的角色。这些角色给吴昕带来的评价大概就是:没有演技,就回去主持吧。']
User[id='qSYSfGkBd9vIDaEfV2cu', title='演技脱胎换骨!吴昕新剧首演“御姐腹黑女”获赞:挺带感', summary='电视剧《爱上北斗星男友》是一部甜甜的网剧,讲述了一位从北斗星来的天星师,到地球来寻找初恋情人姞婉,但是在次过程中遇到姞婉能量重组后的“水逆”女制作人文素汐,由此莫名其妙卷入一场娱乐圈纷争的搞笑故事。', content='该剧请来了徐璐和张铭恩为男女主角,同时湖南卫视主持人吴昕也倾力加盟,让大家倍感期待。从3月13日开播以来,该剧的口碑不断发酵,不仅徐璐和张铭恩的对手戏非常甜腻。另外一个亮点就是吴昕了,吴昕此次在剧中饰演了蔡舒萌,一个与女主角一样职业的女制片人。作为女二号,自然是演绎的奸角,这次反而让大家看到了吴昕演技脱胎换骨。']
-------------end 1
-------------start 2
User[id='qCYSfGkBd9vIDaEfVme5', title='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', summary='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', content='#地震快讯#中国地震台网正式测定:03月14日13时32分在青海黄南州泽库县(北纬34.97度,东经101.83度)发生4.3级地震,震源深度10千米。']
User[id='qiYSfGkBd9vIDaEfV2eZ', title='吴昕新剧演技大翻转 确实进步不少', summary='说起吴昕想必大家都已经很熟悉了吧?是《快本》的主持人,一直以为她非常的快乐、简单,但是看过《我家那闺女》才知道,原来她也有那么多的心事,原来她也很自卑,觉得自己做的不好,原来她也是一个十分敏感的小女孩,她也一直在努力,希望能做的好。', content='除了她的主持能力经常被拿来说,另外一个,大概就是演技了。吴昕出演过得电视剧和电影并不多,不出意外的是,每一部电视剧中,她的演技都要被批评。比如《倾世皇妃》中的小侍女,《深夜食堂》里的的小姑娘,还有快乐家族一起出演的电影中的角色。这些角色给吴昕带来的评价大概就是:没有演技,就回去主持吧。']
//-------------end 2
第一次搜索使用"吴昕",“新剧”,"地震"作为查询参数,其中"吴昕"匹配了第二和第三段新闻,"新剧"没有匹配任何新闻,"地震"匹配了第一段新闻,所以总共匹配出三条数据。
第二次搜索使用"地震",“吴昕”,"地震"作为查询参数,其中第一个"地震"匹配了第一段新闻,"吴昕"匹配了第三段新闻,第二个"地震"匹配了第一段新闻,所以去重后总共匹配了两条数据。
这样,一个简单的ES与Spring Boot集成的代码就出来了,在这里记录一下。