Elasticsearch词条查询(Term Query)是一种精确匹配查询,它不会对查询词进行分词处理,而是直接查找完全匹配的文档。与全文查询不同,词条查询适用于精确匹配keyword类型字段或未分词的text字段。
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
public class ElasticsearchTermQueryExample {
private RestHighLevelClient client;
public SearchResponse searchByTerm(String indexName, String fieldName, String value) throws Exception {
// 构建词条查询
TermQueryBuilder termQuery = QueryBuilders.termQuery(fieldName, value);
// 构建搜索请求
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(termQuery);
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(sourceBuilder);
// 执行查询
return client.search(searchRequest, RequestOptions.DEFAULT);
}
}
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import java.io.IOException;
public class Elasticsearch8TermQueryExample {
public static void main(String[] args) throws IOException {
// 创建客户端
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 构建词条查询
SearchResponse<Object> response = client.search(s -> s
.index("products")
.query(q -> q
.term(t -> t
.field("category.keyword")
.value(v -> v.stringValue("electronics"))
)
),
Object.class
);
// 处理结果
for (Hit<Object> hit : response.hits().hits()) {
System.out.println("Found document: " + hit.source());
}
// 关闭客户端
transport.close();
restClient.close();
}
}
// 使用RestHighLevelClient
TermsQueryBuilder termsQuery = QueryBuilders.termsQuery("tags.keyword", "java", "elasticsearch", "database");
// 使用Java API Client 8.x
SearchResponse<Object> response = client.search(s -> s
.index("articles")
.query(q -> q
.terms(t -> t
.field("tags.keyword")
.terms(te -> te.value(List.of(
FieldValue.of("java"),
FieldValue.of("elasticsearch"),
FieldValue.of("database")
)))
)
),
Object.class
);
原因:
解决方案:
.keyword
子字段原因:
解决方案:
原因:
解决方案:
通过以上方法和示例,您可以在Java中有效地构建和使用Elasticsearch的词条查询。
没有搜到相关的文章