1. 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2. 配置
spring:
elasticsearch:
rest:
uris: http://localhost:9200
3. 获取ElasticsearchTemplate
package com.zqh.essearch.config;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.EntityMapper;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Configuration
public class ElasticsearchConfig extends ElasticsearchConfigurationSupport {
@Bean
public Client elasticsearchClient() throws UnknownHostException {
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
return client;
}
@Bean(name = {"elasticsearchOperations", "elasticsearchTemplate"})
public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
return new ElasticsearchTemplate(elasticsearchClient(), entityMapper());
}
// use the ElasticsearchEntityMapper
@Bean
@Override
public EntityMapper entityMapper() {
ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
new DefaultConversionService());
entityMapper.setConversions(elasticsearchCustomConversions());
return entityMapper;
}
}
4. POJO类定义
package com.zqh.essearch.pojo;
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;
import java.util.List;
@Data
@Document(indexName = "movies", type = "_doc")
public class Movie {
private String id;
private String title;
private List<String> genre;
private Integer year;
}
5. 查询
A. 分页查询
// 分页查询
@RequestMapping("/page")
public Object pageQuery(
@RequestParam(required = false, defaultValue = "10") Integer size,
@RequestParam(required = false, defaultValue = "1") Integer page) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withPageable(PageRequest.of(page, size))
.build();
List<Movie> movies = elasticsearchTemplate
.queryForList(searchQuery, Movie.class);
return movies;
}
B. range查询
// 单条件范围查询, 查询电影的上映日期在2016年到2018年间的所有电影
@RequestMapping("/range")
public Object rangeQuery() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(new RangeQueryBuilder("year").from(2016).to(2018))
.build();
List<Movie> movies = elasticsearchTemplate
.queryForList(searchQuery, Movie.class);
return movies;
}
C. match查询
// 单条件查询只要包含其中一个字段
@RequestMapping("/match")
public Object singleCriteriaQuery(String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(new MatchQueryBuilder("title", searchText))
.build();
List<Movie> movies = elasticsearchTemplate
.queryForList(searchQuery, Movie.class);
return movies;
}
D. 多条件分页查询
@RequestMapping("/match/multiple")
public Object multiplePageQuery(
@RequestParam(required = true) String searchText,
@RequestParam(required = false, defaultValue = "10") Integer size,
@RequestParam(required = false, defaultValue = "1") Integer page) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(
new BoolQueryBuilder()
.must(new MatchQueryBuilder("title", searchText))
.must(new RangeQueryBuilder("year").from(2016).to(2018))
).withPageable(PageRequest.of(page, size))
.build();
List<Movie> movies = elasticsearchTemplate
.queryForList(searchQuery, Movie.class);
return movies;
}
E. 多条件或者查询
// 多条件并且分页查询
@RequestMapping("/match/or/multiple")
public Object multipleOrQuery(@RequestParam(required = true) String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(
new BoolQueryBuilder()
.should(new MatchQueryBuilder("title", searchText))
.should(new RangeQueryBuilder("year").from(2016).to(2018))
).build();
List<Movie> movies = elasticsearchTemplate
.queryForList(searchQuery, Movie.class);
return movies;
}
F. 精准匹配一个单词,且查询就一个单词
//其中包含有某个给定单词,必须是一个词
@RequestMapping("/term")
public Object termQuery(@RequestParam(required = true) String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(new TermQueryBuilder("title", searchText)).build();
List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);
return movies;
}
精准匹配多个单词
//其中包含有某个几个单词
@RequestMapping("/terms")
public Object termsQuery(@RequestParam(required = true) String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(new TermsQueryBuilder("title", searchText.split("\\s+"))).build();
List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);
return movies;
}
G. 短语匹配
@RequestMapping("/phrase")
public Object phraseQuery(@RequestParam(required = true) String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(new MatchPhraseQueryBuilder("title", searchText))
.build();
List<Movie> movies = elasticsearchTemplate
.queryForList(searchQuery, Movie.class);
return movies;
}
H. 只查询部分列
@RequestMapping("/source")
public Object sourceQuery(@RequestParam(required = true) String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withSourceFilter(new FetchSourceFilter(
new String[]{"title", "year", "id"}, new String[]{}))
.withQuery(new MatchPhraseQueryBuilder("title", searchText))
.build();
List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);
return movies;
}
I. 多字段匹配
@RequestMapping("/multiple/field")
public Object allTermsQuery(@RequestParam(required = true) String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(new MultiMatchQueryBuilder(searchText, "title", "genre")
.type(MultiMatchQueryBuilder.Type.MOST_FIELDS))
.build();
List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);
return movies;
}
J. 多单词同时包含
// 多单词同时包含
@RequestMapping("/also/include")
public Object alsoInclude(@RequestParam(required = true) String searchText) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(new QueryStringQueryBuilder(searchText)
.field("title").defaultOperator(Operator.AND))
.build();
List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);
return movies;
}