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();
}
三个参数说明:
- must:文档必须匹配must所包括的查询条件,相当于 “AND”
- should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于 “OR”
- 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();
}