我的环境,
用spring boot整合Elastic search (下面简称es)
jdk 1.8.045 es 6.3.0(最新的)
建了一个@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;
}
//下面是getter 和setter 和toString
2.仓库类
public interface EsBlogRepository extends ElasticsearchRepository
/**
* 分页查询博客(去重)
* @param title
* @param sumarry
* @param content
* @return
*/
Page
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",
"关于如何来用 Elasticsearch,还是得看我的博客 https://waylau.com,妹")); // 关键字"妹"
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
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
这样是错误的,es不翻译Containing这个语义;导致方法查询接口无效;
百度后本人从最简单的入手测试如下:
①findByTitle(String title,Pageable pageable); 有效
② findByTitleContaining(String title,Pageable pageable) 无效
③findByTitleOrSummary(String title,String summary,Pageable pageable) 有效
④findDistinctByTileOrSummary(String title,String summary,Pageable pageable) 有效
⑤findDistinctByTileContainingOrSummaryContaining(String title,String summary,Pageable pageable) 无效
虽然③④都有效但是,结果是一样的;④已经去重,但是③也去重了;不知道是不是最新版本不需要写Distinct
⑥findDistinctByTileContainingOrSummaryContainingOrContentContaining(String title,String summary,String content,Pageable pageable) 无效
虽然 ⑥是无效的;但是把Containing去掉(就是上面代码接口中的方法)是有效的
所以:
虽然不知道es之前版本怎样,但是在ElasticSearch6.3.0中自定义仓库接口方法时,结论两个:一、如果方法名有Containing直接检索无效;二、方法名加入Distinct有效,但是不加一样可以去重(方法本身自带去重效果)
我是第一次接触es,不对的地方,希望大家留言指正,共同学习;