sprinboot 整合 elasticsearch实现各种查询:高亮查询、termQuery、rangeQuery、matchQuery、multiMatchQuery、分页查询

sprinboot 整合 elasticsearch实现各种查询:高亮查询、termQuery、rangeQuery、matchQuery、multiMatchQuery、分页查询
摘要由CSDN通过智能技术生成

注意:本文使用 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 
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值