2017-04-17 106 views
2

我正在尝试在搜索的弹性搜索中获得组的唯一值。我无法弄清楚为什么这不行为。弹性搜索唯一字段值

我已经经历了许多StackOverflow问题,并阅读了大部分时间的文档。没有什么似乎为我工作,下面我提供了我最后的尝试。

是否有任何理由有人想要一次返回相同的结果?也许是文档的不同版本?


在这个例子中,我想所有mfr_id的的上市,他们的mfr_desc为好。我正在通过一个类型运行这个来搜索文档字段值。看来Agg条款是完成这个任务的方式,有没有人看到我做错了什么?


1:API调用

GET /inventory/item/_search 
{ 
    "size": 0, 
    "_source": ["mfr_id", "mfr_desc"], 
    "aggs": { 
    "unique_vals": { 
     "terms": { 
     "field": "mfr_id.keyword" 
     /** I have to use .keyword, seems like my mappings isn't working */ 
     } 
    } 
    } 
} 

2:映射文件

我做了批量导入后运行的映射是非常简单的。我读,如果你想有一个唯一的查询不密钥分析:

{ 
    "index": "inventory", 
    "body": { 
    "settings": { 
     "number_of_shards": 1 
    }, 
    "mappings": { 
     "_default_": { 
     "properties": { 
      "mfr_id": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     } 
    } 
    } 
} 

3:我的结果 聚集了〜10个记录时,大约有100我真的很希望能够得到_source如果可能的话,这些领域不仅仅是一个关键。

{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
    "total": 1, 
    "successful": 1, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 49341, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "unique_vals": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 6815, 
     "buckets": [ 
     { 
      "key": "14", 
      "doc_count": 24292 
     }, 
     { 
      "key": "33", 
      "doc_count": 5508 
     }, 
     ... 

回答

1

我真的很希望能够获得超过 只是一个关键的_source领域,如果这是可能的。

我想,你只有一个选择,我面临同样的问题。试试这个: -

{ 
    "aggregations": { 
     "byId": { 
      "terms": { 
       "field": "mfr_id" 
      }, 
      "aggs": { 
       "byDesc": { 
        "terms": { 
         "field": "mfr_desc" 
        } 
       } 
      } 
     } 
    } 
} 

现在,您将在遍历弹性搜索JAVA API的同时获得id和desc。

Terms aTerms = aAggregations.get("byId"); 
aTerms.getBuckets().stream().forEach(aBucketById-> { 
      Terms aTermsDesc = aBucketById.getAggregations().get("byDesc"); 
      aTermsDesc.getBuckets().stream().forEach(aBucketByDesc -> { 
//store id and desc 
    }); 
}); 
+1

哇,谢谢!我不会试过这个。我感到惊讶的是,文件并不清晰。它没有提供这样的例子;或者如果确实存在,我找不到它。这很聪明,我想知道为什么像这样简单这样的功能是如此微不足道。另外,你的个人资料中有非常好的技能。 – JREAM

+0

感谢您的赞美:) –

1

我会使用一个过滤器,它比聚合具有更好的性能。

在聚合中,您将获得所有文档,并且只会应用聚合。如果使用过滤器,则只会获得与过滤器匹配的文档,并且还可以缓存过滤器。

{ 
    "query": { 
     "constant_score": { 
      "filter": { 
       "exists": { 
        "field": "mfr_id" 
       } 
      } 
     } 
    } 
}