elasticsearch - Elasticsearch - 如何为某些字段返回不同的文档
问题描述
我有下一个 elasticsearch 查询,我需要知道如何只获得某些字段的不同结果。(就像一个 sql distinct:SELECT DISTINCT column1 , column2, ... FROM table_name :wink:
这是我的查询
{
"_source": ["part", "manufacturer", "shortdesc"],
"query": {
"match": {
"part": "2n2222"
}
}
}
这是我得到的结果:
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "13921",
"_score" : 207.16005,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "13923",
"_score" : 207.16005,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "811202",
"_score" : 202.03964,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "534059",
"_score" : 202.03964,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "534062",
"_score" : 202.03964,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "144303",
"_score" : 202.03964,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "557240",
"_score" : 202.03964,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Infineon"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "13924",
"_score" : 201.24086,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "557235",
"_score" : 201.24086,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "55566",
"_score" : 201.24086,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "50873",
"_score" : 201.24086,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "13915",
"_score" : 199.76857,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "591924",
"_score" : 199.76857,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "526043",
"_score" : 199.76857,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "423282",
"_score" : 198.89282,
"_source" : {
"part" : "2N2222A",
"manufacturer" : "Microsemi Corporation"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "565951",
"_score" : 193.51782,
"_source" : {
"part" : "P2N2222A",
"manufacturer" : "ON Semiconductor"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "13920",
"_score" : 192.1505,
"_source" : {
"part" : "P2N2222A",
"manufacturer" : "ON Semiconductor"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "2885944",
"_score" : 191.28773,
"_source" : {
"part" : "Q2N2222A",
"manufacturer" : "Freescale Semiconductor"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "765656",
"_score" : 191.28773,
"_source" : {
"part" : "2N2222AL",
"manufacturer" : "Microsemi"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "491090",
"_score" : 190.78474,
"_source" : {
"part" : "2N2222AUB",
"manufacturer" : "Microsemi Corporation"
}
}
如果记录包含相同的部件和制造商,则该记录被视为重复。我需要为这些字段获取不同的值。
非常感谢你的帮助。
解决方案
我相信您需要在查询中使用聚合来获得不同的对行为。有关不同值查询的示例,请参见this 。
链接问题与您的案例之间的主要区别在于您有两个字段,并且您需要所有不同的对,而不是两个字段的不同值。
编辑:刚刚对此进行了测试,它似乎具有您想要做的行为。您可以通过删除/禁用术语聚合的 doc_count 计数并使用 _source 来优化它,就像您在问题中所做的那样。您还可以添加查询和匹配子句以过滤到给定的零件/制造商。
EDIT2:将查询/匹配添加到问题中的请求中。
GET YOURINDEX/_search
{
"query": {
"match": {
"part.keyword": "2n2222"
}
},
"size": 0,
"aggs": {
"actions": {
"terms": {
"field": "part.keyword"
},
"aggs": {
"emails": {
"terms": {
"field": "manufacturer.keyword"
}
}
}
}
}
}
推荐阅读
- symfony - 如果“framework.test”配置未设置为 true,则无法创建用于功能测试的客户端
- node.js - 如何在 nodejs 中使用过滤器修剪 docker 网络?
- c# - 如何询问直到用户在 C# 中得到特定回复
- shell - Makefile:重用环境变量
- bash - 等待 Live555 进程完成
- r - 如何从 TCGAquery_recount2 的返回对象中提取 colnames
- mongodb - 根据另一个文档值查找匹配条件的文档
- java - 如何在适配器外部的 ListView 和 GridView 中获取项目位置?
- django - Django .query 属性行为
- redisson - 为什么 reddison ExpirationEntry 使用 LinkedHashMap 来保存 Thread?