Java连接Elasticsearch6.xxx 高级检索篇三

1、 termQuery:精确查询

Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。

    /***
	 * termQuery
	 * @throws Exception
	 */
	@Test
	public void termQuery() throws Exception{
		
		//1、获取客户端连接
    	TransportClient client = ESTools.getTransportClient();
    	
    	//2、构造查询条件:termQuery
    	QueryBuilder builder = QueryBuilders.termQuery("name","java");
    	
    	//.setSize(2)可设置查询条数
    	SearchResponse response = client.prepareSearch("book").setQuery(builder).get();
    	
    	//返回查询结果
    	SearchHits hits = response.getHits();
    	
    	for (SearchHit searchHit : hits) {
    		
    		System.out.println(searchHit.getSourceAsString());
    		
		}
    	
    	//关闭客户端
    	client.close();
	}
}

2、 matchQuery:全文检索

match Query即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索。

我们可以设置它的查询规则
Operator.AND //AND 表示:每个词都在文档中出现才符合条件
Operator.OR  //OR 表示:只要有一个词在文档中出现则就符合条件
默认不设置的情况下写法
    /***
	 * matchQuery
	 * @throws Exception
	 */
	@Test
	public void m() throws Exception{
		
		//1、获取客户端连接
    	TransportClient client = ESTools.getTransportClient();
    	
    	//2、构造查询条件:matchQuery
    	QueryBuilder builder = QueryBuilders.matchQuery("name","java开发");
    	
    	//.setSize(2)可设置查询条数
    	SearchResponse response = client.prepareSearch("book").setQuery(builder).get();
    	
		//返回查询结果
    	SearchHits hits = response.getHits();
    	
    	for (SearchHit searchHit : hits) {
    		System.out.println(searchHit.getSourceAsString());
		}
    	
    	//关闭客户端
    	client.close();
	}
设置Operator.AND
//2、构造查询条件:matchQuery
QueryBuilder builder = QueryBuilders.matchQuery("name","java开发").operator(Operator.AND);
设置Operator.OR
//2、构造查询条件:matchQuery
QueryBuilder builder = QueryBuilders.matchQuery("name","java开发").operator(Operator.OR);

3、multiMatchQuery:一次可以匹配多个字段

termQuery和matchQuery一次只能匹配一个Field,multiQuery:一次可以匹配多个字段

单项匹配是在一个field中去匹配,多项匹配是拿关键字去多个Field中匹配。
匹配多个字段时可以提升字段的boost(权重)来提高得分
    /***
	 * multiMatchQuery
	 * @throws Exception
	 */
	@Test
	public void termQuery() throws Exception{
		
		//1、获取客户端连接
    	TransportClient client = ESTools.getTransportClient();
    	
    	//2、构造查询条件:multiMatchQuery
    	MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架","name", "description")
    			.minimumShouldMatch("50%");
    			multiMatchQueryBuilder.field("name",10);//提升boost
    	
    	//.setSize(2)可设置查询条数
    	SearchResponse response = client.prepareSearch("book").setQuery(multiMatchQueryBuilder).get();
    	
    	//返回查询结果
    	SearchHits hits = response.getHits();
    	
    	for (SearchHit searchHit : hits) {
    		
    		System.out.println(searchHit.getSourceAsString());
    		
		}
    	
    	//关闭客户端
    	client.close();
	}
说明:提升boost,通常关键字匹配上name的权重要比匹配上description的权重高,这里可以对name的权重提升。
“name^10” 表示权重提升10倍,执行上边的查询,发现name中包括"spring框架"关键字的文档排在前边。

4、boolQuery:多条件组合查询

布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来。
    /***
	 * boolQuery
	 * @throws Exception
	 */
	@Test
	public void termQuery() throws Exception{
		
		//1、获取客户端连接
    	TransportClient client = ESTools.getTransportClient();
    	
    	//2、构造查询条件:multiMatchQuery
    	MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架","name", "description")
    			.minimumShouldMatch("50%");
    			multiMatchQueryBuilder.field("name",10);//提升boost
    			
		//3、再构造查询条件:TermQuery
		TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "2020");
		
		//4、设置布尔查询:boolQuery
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		boolQueryBuilder.must(multiMatchQueryBuilder);
		boolQueryBuilder.must(termQueryBuilder);

    	
    	//设置查询对象、执行查询
    	SearchResponse response = client.prepareSearch("book").setQuery(boolQueryBuilder).get();
    	
    	//返回查询结果
    	SearchHits hits = response.getHits();
    	
    	for (SearchHit searchHit : hits) {
    		
    		Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
    		System.out.println(sourceAsMap);
    		
		}
    	
    	//关闭客户端
    	client.close();
	}

三个参数说明:

  1. must:文档必须匹配must所包括的查询条件,相当于 “AND”
  2. should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于 “OR”
  3. must_not:文档不能匹配must_not所包括的该查询条件,相当于“NOT”

5、 过虑器:filter

range:范围过虑,保留大于等于xxx 并且小于等于xxx的记录。(没数据、不进行演示)
term:项匹配过虑,保留studymodel等于"2018"的记录。

过虑是针对搜索的结果进行过虑,过虑器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,所以过
虑器性能比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用。

    /***
	 * filter
	 * @throws Exception
	 */
	@Test
	public void termQuery() throws Exception{
		
		//1、获取客户端连接
    	TransportClient client = ESTools.getTransportClient();
    	
    	//2、构造查询条件:multiMatchQuery
    	MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架","name", "description")
    			.minimumShouldMatch("50%");
    			multiMatchQueryBuilder.field("name",10);//提升boost
    			
		//3、设置布尔查询:boolQuery
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		boolQueryBuilder.must(multiMatchQueryBuilder);

		//4、过虑:filter
		boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel", "2018"));
		
    	//设置查询对象、执行查询
    	SearchResponse response = client.prepareSearch("book").setQuery(boolQueryBuilder).get();
    	
    	//返回查询结果
    	SearchHits hits = response.getHits();
    	
    	for (SearchHit searchHit : hits) {
    		
    		Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
    		System.out.println(sourceAsMap);
    		
		}
    	
    	//关闭客户端
    	client.close();
	}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DT辰白

你的鼓励是我创作的源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值