赞
踩
es本身没有客户端界面,为了数据查询方便,我们使用head插件《ElasticSearch系列(三)linux环境中安装配置head插件以及使用方法》
这个比较简单,不详细说了。
注意本文使用springboot版本是2.2.0,此本版内部依赖的ES客户端版本是6.8.1。
<!--es-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
版本号就是跟随springboot版本;
注意:
如果es服务安装的是es7及以上版本,需要springboot版本为2.2.0及以上,不然启动项目会提示failed load nodes…
本文服务端安装的是ES7.3.0,支持的客户端版本最低是6.8.0,所以需要springboot依赖的es版本超过6.8.0。
如果要自定义ES版本号,指定下就行:
但是这里不建议自定义,除非你使用es原生api,而不是springboot封装的api,不然有些会报错。
spring:
data:
elasticsearch:
cluster-name: myes
cluster-nodes: 192.168.32.129:9301,192.168.32.129:9302,192.168.32.129:9303
注意,在ES7.0版本后,上述配置已经废弃,推荐使用基于http的REST通信(https://docs.spring.io/spring-data/elasticsearch/docs/3.2.6.RELEASE/reference/html/#elasticsearch.clients.transport),如下配置:
@Configuration
public class EsConfig {
@Bean
RestHighLevelClient client() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("192.168.17.101:9201", "192.168.17.101:9202", "192.168.17.101:9203")
.build();
return RestClients.create(clientConfiguration).rest();
}
}
注意通信端口也使用9200,这个是http的。
@Document(indexName = "index_blog", type = "article")
@Data
public class ArticleEntity {
@Id
@Field(type = FieldType.Long, store = true)
private Long id;
@Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
private String title;
@Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
private String content;
}
其中,
默认es只有标准分词器,这里使用的是IK分词器,需要单独配置,可参考文章《ElasticSearch系列(四)ES集成IK分词器以及使用方式》
另外,Elasticsearch和关系数据库概念对应关系:
关系数据库 => | 数据库 | 表 | 行 | 列 |
---|---|---|---|---|
Elasticsearch => | 索引(Index) | 类型(type) | 文档(Docments) | 字段(Fields) |
注意:
ES7中,已经废弃了type的概念,默认使用_doc作为类型名;也就是一个索引中,只能存在一个类型(一个表),那就是 _toc。
创建mapping的时候,不用指定type这一层级,否则报错。
@Repository
public interface ArticleRepository extends ElasticsearchRepository<ArticleEntity, String> {
}
其中,
@Repository注解可以使此接口被spring扫描到,如果不加此注解,也可以手动配置dao层的包扫描路径:
@SpringBootApplication
//添加dao层包扫描
@EnableElasticsearchRepositories(basePackages = "com.example.demo.es.dao")
public class DemoApplication extends SpringBootServletInitializer {
ElasticsearchRepository接口,提供了一些增删改查等众多方法,集成它就可以直接使用这些方法了。
@RestController @RequestMapping("/article") public class EsArticleController { @Autowired private ArticleRepository articleReposiory; @PostMapping("/addArticle") public ArticleEntity addArticle(@RequestBody ArticleEntity article) { return articleReposiory.save(article); } @GetMapping("/findArticle/{id}") public Optional<ArticleEntity> findArticle(@PathVariable Long id) { return articleReposiory.findById(String.valueOf(id)); } @DeleteMapping("/delete/{id}") public void deleteArticle(@PathVariable Long id) { articleReposiory.deleteById(String.valueOf(id)); } }
启动项目,spring就是自动帮助创建代码中指定过的索引,比如本文中写了个ArticleEntity,指定了index为"index_blog",启动项目后,登陆head插件,发现已经创建好了索引:
索引信息:
使用postman访问下:
使用head插件看下存进去的数据:
ES的修改,过程是先删除后添加,因此修改方法就是添加方法,只要保证id相同就行。
articleReposiory.findAll();
上述查询,使用的都是articleReposiory自带的方法,实现一些简单查询,但是如果想实现复杂一点查询,比如根据ArticleEntity中的title字段查询:
public interface ArticleRepository extends ElasticsearchRepository<ArticleEntity, String> {
List<ArticleEntity> findByTitle(String title);
List<ArticleEntity> findByTitleOrContent(String title, String content);
List<ArticleEntity> findByTitleOrContent(String title, String content, Pageable pageable);
}
命名遵循规范就行,idea本身也有提提示,然后就可以使用这个方法进行查询了:
articleReposiory.findByTitle(title);
List<ArticleEntity> findByTitleOrContent(String title, String content, Pageable pageable);
@GetMapping("/findByTitleOrContentPage")
public List<ArticleEntity> findByTitleOrContentPage(String title, String content, Integer pageNum, Integer pageSize) {
Pageable pageable = PageRequest.of(pageNum, pageSize);
return articleReposiory.findByTitleOrContent(title, content, pageable);
}
使用Pageable参数,注意页码从0开始。
使用NativeSearchQuery查询条件,可以做到更灵活更复杂的查询:
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@GetMapping("/findByTitleOrContentPageByTemplate")
public List<ArticleEntity> findByTitleOrContentPageByTemplate(String title, String content, Integer pageNum, Integer pageSize) {
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery(title).defaultField("title"))
.withQuery(QueryBuilders.queryStringQuery(content).defaultField("content"))
.withPageable(PageRequest.of(pageNum, pageSize))
.build();
return elasticsearchRestTemplate.queryForList(nativeSearchQuery, ArticleEntity.class);
}
本文就先介绍到这里,关于NativeSearchQuery更多的用法,放在后文《ElasticSearch系列(六)springboot中使用QueryBuilders、NativeSearchQuery实现复杂查询》
中介绍。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。