我的环境,
用spring boot整合Elastic search (下面简称es)
建了一个@document的文档类,还有一个集成ElasticSerchRepository仓库接口;
代码:
0.application.properties
spring.data.elasticsearch.cluster-nodes=localhost:9300
1.文档类
@Document(indexName = "blog",type="blog")
public class EsBlog implements Serializable{
private static final long serialVersionUID = 1L;
@Id
private String id;
private String title;
private String sumarry;
private String content;
protected EsBlog() {
}
public EsBlog(String id, String title, String sumarry, String content) {
this.id = id;
this.title = title;
this.sumarry = sumarry;
this.content = content;
}
2.仓库类
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String>{
/**
* 分页查询博客(去重)
* @param title
* @param sumarry
* @param content
* @return
*/
Page<EsBlog> findByTitleOrSumarryOrContent(String title,String summary,String content,Pageable pageable);
3.测试类
@RunWith(value = SpringRunner.class)
@SpringBootTest
public class TestEsBlogRepository {
/**
* 分页查询博客(去重)
* @param title
* @param sumarry
* @param content
* @return
*/
@Autowired
EsBlogRepository esBlogRepository;
@Before
public void initRepository() {
System.out.println("=====================================");
esBlogRepository.deleteAll();
esBlogRepository.save(new EsBlog("1","老卫跟你谈谈安装 Elasticsearch","老卫elasticsearch",
"关于如何来安装 Elasticsearch,这个请看我的博客 https://waylau.com"));
esBlogRepository.save(new EsBlog("2","老卫跟你谈谈 Elasticsearch 的几个用法","老卫elasticsearch",
esBlogRepository.save(new EsBlog("3","老卫和你一起学 Elasticsearch","elasticsearch",
"如何来学习 Elasticsearch,最终看我的博客 https://waylau.com,酒")); // 关键字"酒"
}
@Test
public void testFindDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining() {
try {
Pageable pageable = new PageRequest(0, 20);
String title = "老卫";
String sumarry = "老卫";
String content = "如果";
Page<EsBlog> page = esBlogRepository.findByTitleOrSumarryOrContent(title,sumarry,content,pageable);
System.out.println(page.getTotalElements());
assertThat(page.getTotalElements()).isEqualTo(6);
} catch (Exception e) {
e.printStackTrace();
}
}
错误两个
第一个:
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{NJnXzVnyRoGUI4N8wK6cUg}{localhost}{127.0.0.1:9300}]]
翻译一下就是一个配置节点都没有定义;什么是节点,就是一个es服务都没启动(一个节点对应一个ElasticSearch6.3.0或者一个es集群);启动es解决(ps:启动就是在根目录bin中的elasticsearch.bat)
第二个:
在仓库接口中起方法名的时候:
看17年的一个视频上写:
Page<EsBlog> findDistinctByTitleContainingOrSumarryContainingOrContentContaining(String title,String summary,String content,Pageable pageable);
这样是错误的,es不翻译Containing这个语义;导致方法查询接口无效;
(String title,String summary,Pageable pageable)
findDistinctByTileContainingOrSummaryContaining
findDistinctByTileContainingOrSummaryContainingOrContentContaining
所以:
虽然不知道es之前版本怎样,但是在ElasticSearch6.3.0中自定义仓库接口方法时,结论两个:一、如果方法名有Containing直接检索无效;二、方法名加入Distinct有效,但是不加一样可以去重(方法本身自带去重效果)
我是第一次接触es,不对的地方,希望大家留言指正,共同学习;