如果你需要使用Elasticsearch的BoolQueryBuilder来查询name字段精确为"liming"的记录,你可以简单地使用TermQueryBuilder来实现。TermQuery用于精确匹配文档的一个字段。这种查询非常适合用于不分词的字符串字段(例如keyword类型的字段)或者数字、日期等类型的字段。
以下是使用BoolQueryBuilder和TermQueryBuilder查询name字段为"liming"的Java代码示例:
java
Copy code
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import java.net.InetAddress;
public class ElasticsearchExactMatchQuery {
public static void main(String[] args) throws Exception {
// 创建客户端
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300));
// 创建 BoolQueryBuilder
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 使用 TermQuery 精确匹配 "name" 字段
boolQuery.must(QueryBuilders.termQuery("name.keyword", "liming"));
// 执行查询
SearchResponse response = client.prepareSearch("your_index")
.setQuery(boolQuery)
.get();
// 打印结果
response.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));
// 关闭客户端
client.close();
}
}
代码解释
创建客户端: 这里使用了PreBuiltTransportClient来连接本地的Elasticsearch集群。
构建查询: 使用BoolQueryBuilder结合TermQueryBuilder。termQuery适用于不分词的字段,所以这里假设你有一个name.keyword字段,它是不分词的。如果name字段是分词的(text类型),则应该使用matchQuery。
执行查询: 使用prepareSearch方法指定索引并设置查询。
打印结果: 通过getHits()方法获取并打印每个匹配的文档。
关闭客户端: 在查询完成后关闭客户端。
确保在实际部署前检查字段名(如name.keyword)和索引名(如your_index),以符合你的Elasticsearch配置。如果name字段是分词的(即默认为text类型),并且你想对整个字段内容进行精确匹配,确保使用.keyword后缀或者创建一个未分词的自定义字段。