添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
添加配置
启动类添加注解,包名注意换成自己的
@EnableElasticsearchRepositories(basePackages = {"com.rd"})
配置类添加elasticSearch的ip和端口,ip需要换成自己的
spring.elasticsearch.rest.uris=http://rd.xuniji.com:9200
如果是elasticSearch是本地的,那其实地址不用添加也行,源码默认的是localhost:9200
相关API测试
先建相关的基础类
Bo类:
@Document(indexName = "article_index", type = "article")
@Data
@ToString
public class ElasticArticleBo {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Keyword)
private String author;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String content;
@Field(type = FieldType.Keyword)
private String createTime;
}
定义相关的ElasticSearch的注解之后,会自动创建相关的索引库
定义ElasticSearchArticleRepository类
@Repository
public interface ElasticSearchArticleRepository extends ElasticsearchRepository<ElasticArticleBo, Integer> {
}
类似jpa一样,可以通过规范的命名进行操作ES
定义相关的ElasticSearch相关的操作类
@Service
public class ElasticSearchService {
/**
* ElasticsearchTemplate现在已弃用,建议使用ElasticSearchRestTemplate
*/
@Autowired
private ElasticsearchRestTemplate restTemplate;
/**
* 底层采用了:
* protected ElasticsearchOperations operations;
* protected IndexOperations indexOperations;
*/
@Autowired
private ElasticSearchArticleRepository articleRepository;
/**
* 无需运行此方法,在实体类标注运行的时候就会自动创建索引库
*/
public void test1() {
IndexOperations operations = restTemplate.indexOps(ElasticArticleBo.class);
boolean exists = operations.exists();
Console.log("索引库是否存在:{}", exists);
if (exists) {
//获取mapping
Map<String, Object> mapping = operations.getMapping();
Console.log("mapping:{}", mapping);
//获取 alias
List<AliasMetaData> aliasMetaData = operations.queryForAlias();
Console.log("获取alias:{}", aliasMetaData);
} else {
//推荐使用index方式
//1、创建单个索引库(带type映射)
System.out.println("执行了索引创建方法");
operations.create();
operations.putMapping(operations.createMapping());
}
}
//-------------------------------------文档操作----------------------------------------
public void testD1() {
boolean add = false;
Optional<ElasticArticleBo> articleBo = articleRepository.findById(1);
if (!articleBo.isPresent()) {
ElasticArticleBo article = new ElasticArticleBo();
article.setId(1L);
article.setTitle("Spring Data Elasticsearch");
article.setAuthor("binjie09");
article.setContent("Spring Data Elasticsearch is easy to use.");
article.setCreateTime(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));
articleRepository.save(article);
add = true;
}
if (add) {
articleBo = articleRepository.findById(1);
}
System.out.println("\r\n查询到的文章信息:" + articleBo);
// articleRepository.deleteById(1);
}
/**
* 批量插入
*/
public void testD2() {
testD1();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Date date = DateUtil.date().toJdkDate();
var list = new ArrayList<ElasticArticleBo>();
for (int i = 2; i <= 10000; i++) {
ElasticArticleBo article = new ElasticArticleBo();
article.setId((long) i);
article.setTitle("Spring Data Elasticsearch" + RandomUtil.randomString(100));
article.setAuthor("binjie09" + RandomUtil.randomString(50));
article.setContent("Spring Data Elasticsearch is easy to use." + RandomUtil.randomString(150));
Date addDays = DateUtils.addDays(date, RandomUtil.randomInt(100, 300));
article.setCreateTime(DateUtil.format(addDays, DatePattern.NORM_DATETIME_PATTERN));
list.add(article);
}
Console.log("列表长度:{}", list.size());
articleRepository.saveAll(list);
stopWatch.stop();
System.out.println("耗时:" + stopWatch.getTotalTimeMillis());
}
/**
* 分页查询
*
* @param pageNo 页码
* @param pageSize 大小
*/
public void testD3GetBooksByPage(int pageNo, int pageSize) {
Pageable pageable = PageRequest.of(pageNo, pageSize);
Page<ElasticArticleBo> repositoryAll = articleRepository.findAll(pageable);
Console.log(repositoryAll);
}
/**
* 使用 ElasticsearchRestTemplate 进行分页查询
*/
public void testPageV2() {
Pageable pageable = PageRequest.of(1, 20);
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchAllQuery())
.withPageable(pageable)
.build();
SearchHits<ElasticArticleBo> searchHits = restTemplate.search(searchQuery, ElasticArticleBo.class);
List<ElasticArticleBo> articleBos = searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
var pageResult = new PageResult<>(articleBos, pageable.getPageNumber(), pageable.getPageSize(), (int) searchHits.getTotalHits());
Console.log(pageResult);
}
/**
* JAVA操作ES中的BoolQueryBuilder 查询方法
* 1,matchAllQuery匹配所有
* 2.termQuery精准匹配,大小写敏感且不支持
* 3.matchPhraseQuery对中文精确匹配
* 4.matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性
* 5.multiMatchQuery("text", "field1", "field2"..); 匹配多个字段
* 6.组合查询
* must: AND
* mustNot: NOT
* should:: OR
* 方法:=>
* 匹配所有
* 查询 作者为binjie09 并且 title为Spring Data Elasticsearch 的数据
* 精准
* 模糊
*/
public void testQueryBuilder() {
Query searchQuery;
SearchHits<ElasticArticleBo> searchHits;
//匹配所有
searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchAllQuery())
.build();
searchHits = restTemplate.search(searchQuery, ElasticArticleBo.class);
Console.log("匹配查询所有结果:{}", searchHits.getTotalHits());
Console.log();
// 查询 作者为binjie09 并且 title为Spring Data Elasticsearch 的数据
searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("author", "binjie09"))
.must(QueryBuilders.matchQuery("title", "Spring Data Elasticsearch")))
.build();
searchHits = restTemplate.search(searchQuery, ElasticArticleBo.class);
Console.log("匹配多条件 && 结果:{}", searchHits.getTotalHits());
if (searchHits.getTotalHits() == 1) {
Console.log(searchHits.getSearchHits());
System.out.println();
}
//精准
searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("author", "binjie09")))
.build();
searchHits = restTemplate.search(searchQuery, ElasticArticleBo.class);
Console.log("精准查询结果:");
searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList()).forEach(Console::log);
System.out.println();
//模糊
searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.boolQuery()
.should(QueryBuilders.fuzzyQuery("title", "abcde")))
.build();
searchHits = restTemplate.search(searchQuery, ElasticArticleBo.class);
Console.log("模糊结果:{}", searchHits.getSearchHits().size());
searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList()).forEach(Console::log);
Console.log();
//是否存在
searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.existsQuery("abc"))
.build();
searchHits = restTemplate.search(searchQuery, ElasticArticleBo.class);
Console.log("是否存在:{}", searchHits.getSearchHits().size());
searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList()).forEach(Console::log);
Console.log();
}