如何在ElasticSearch中通过单个查询获取指定名称条目的同类别所有条目
单次查询获取同class的所有文档
你可以通过两种简洁的方式实现单次查询完成需求,下面分别介绍:
方法一:使用Terms Lookup(需提前获取目标文档ID)
如果能先通过name查询到目标文档的_id,可以用Elasticsearch的Terms Lookup特性,直接在查询中引用该文档的class值来匹配所有同class的文档:
GET /your_index_name/_search { "query": { "terms": { "class": { "index": "your_index_name", "id": "目标文档的_id", // 比如通过name=item1查到的文档ID "path": "class" } } } }
这个查询会自动先获取指定ID文档的class字段值,再返回所有class字段等于该值的文档。
方法二:使用聚合查询(无需提前获取ID,纯单次查询)
如果不想先查ID,直接用聚合查询一次性完成:通过聚合按class分组,筛选出包含name=item1的分组,再取出该分组下的所有文档:
GET /your_index_name/_search { "size": 0, // 不返回原始查询结果,只看聚合结果 "aggs": { "group_by_class": { "terms": { "field": "class" }, "aggs": { // 筛选当前class分组中是否包含name=item1的文档 "has_target_item": { "filter": { "match": { "name": "item1" } } }, // 获取当前class分组下的所有文档 "all_class_items": { "top_hits": { "size": 1000 // 根据实际情况调整返回的文档数量上限 } } } } } }
执行后,你需要在聚合结果中找到has_target_item.doc_count > 0的group_by_class bucket,里面的all_class_items.hits.hits就是所有和item1同class的文档。
补充说明
如果你的索引数据量较大,方法一的性能会更好,因为Terms Lookup是直接基于字段值的精确匹配;方法二则更适合不需要提前查ID的场景,一步到位。
内容的提问来源于stack exchange,提问作者Mohamed AL ANI
相关产品推荐
相关产品推荐

