注意:本文使用 Springboot 2.4.3,、elasticsearchRestTemplate,elasticsearch使用的是 7.9.3
主要是学习使用 ElasticsearchRestTemplate 的 API,termQuery、matchQuery、rangeQuery、fuzzyQuery、matchAllQuery、multiMatchQuery、分页查询、高亮查询、排序等查询方式
/**
* 查询所有文档
* {"from":0,"size":10000,"query":{"match_all":{"boost":1.0}},"version":true}
*
* @return
*/
@GetMapping("/matchAllQuery")
public Object matchAllQuery() {
NativeSearchQuery matchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).build();
SearchHits<Brand> searchHits = elasticsearchRestTemplate.search(matchQuery, Brand.class);
return searchHits;
}
/**
* 根据搜索关键字查询文档,搜索关键字不分词
* {"from":0,"size":10000,"query":{"term":{"name":{"value":"小米","boost":1.0}}},"version":true}
*
* @param keyword
* @return
*/
@GetMapping("/termQuery")
public Object termQuery(String keyword) {
NativeSearchQuery termQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.termQuery("name", keyword)).build();
SearchHits<Brand> search = elasticsearchRestTemplate.search(termQuery, Brand.class);
return search;
}
/**
* 根据搜索关键字分词后的字段搜索文档
* 关键字会分词,其实该方式等价于matchQuery
* {
* "from": 0,
* "size": 10000,
* "query": {
* "common": {
* "name": {
* "query": "宇华华为",
* "high_freq_operator": "OR",
* "low_freq_operator": "OR",
* "cutoff_frequency": 0.01,
* "boost": 1.0
* }* }
* },
* "version": true
* }
*
* @param keyword
* @return
*/
@GetMapping("/commonTermsQuery")
public Object commonTermsQuery(String keyword) {
NativeSearchQuery commonTermsQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.commonTermsQuery("name", keyword)).build();
SearchHits<Brand> search = elasticsearchRestTemplate.search(commonTermsQuery, Brand.class);
return search;
}
/**
* 模糊匹配、接近匹配
* 查询包含搜索关键字 分词后的字段 的数据
* 如果在一个精确值的字段上使用它,例如数字、日期、布尔或者一个 not_analyzed 字 符串字段,那么它将会精确匹配给定的值:
* {
* "from": 0,
* "size": 10000,
* "query": {
* "match": {
* "name": {
* "query": "中华华为",
* "operator": "OR",
* "prefix_length": 0,
* "max_expansions": 50,
* "fuzzy_transpositions": true,
* "lenient": false,
* "zero_terms_query": "NONE",
* "auto_generate_synonyms_phrase_query": true,
* "boost": 1.0
* }* }
* },
* "version": true
* }
*
* @param keyword
* @return
*/
@GetMapping("/matchQuery")
public Object matchQuery(String keyword) {
NativeSearchQuery matchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("name", keyword)).build();
SearchHits<Brand> search = elasticsearchRestTemplate.search(matchQuery, Brand.class);
return search;
}
/**
* 精确匹配查询,搜索关键字不分词 ,针对的是一个语句
*
* @param keyword
* @return
*/
@GetMapping("/matchPhraseQuery")
public Object matchPhraseQuery(String keyword) {
NativeSearchQuery matchPhraseQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchPhraseQuery("name", keyword)).build();
SearchHits<Brand> search = elasticsearchRestTemplate.search(matchPhraseQuery, Brand.class);
return search;
}
/**
* 这种精准查询满足的条件有点苛刻,有时我们想要包含 ""广东靓仔靓女"" 的文档也能够匹配 "广东靓女"。这时就要以用到 "slop" 参数来控制查询语句的灵活度。
* slop 表示相隔多远时,还能匹配到。比如 搜索关键字为 广东靓女,设置slop为2,表示中间可以相隔为2,所以广东靓仔靓女这条数据也是满足条件的
* {
* "from": 0,
* "size": 10000,
* "query": {
* "match_phrase": {
* "name": {
* "query": "广东靓女",
* "slop": 2,
* "zero_terms_query": "NONE",
* "boost": 1.0
* }* }
* },
* "version": true
* }
*
* @param keyword
* @return
*/
@GetMapping("/matchPhraseQueryWithSlop")
public Object matchPhraseQueryWithSlop(String keyword) {
NativeSearchQuery