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();
}
}
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();
}
//2、构造查询条件:matchQuery
QueryBuilder builder = QueryBuilders.matchQuery("name","java开发").operator(Operator.AND);
//2、构造查询条件:matchQuery
QueryBuilder builder = QueryBuilders.matchQuery("name","java开发").operator(Operator.OR);
termQuery和matchQuery一次只能匹配一个Field,multiQuery:一次可以匹配多个字段
/***
* 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();
}
/***
* 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();
}
三个参数说明:
过虑是针对搜索的结果进行过虑,过虑器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,所以过
虑器性能比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用。
/***
* 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();
}