弹性搜索查询排除来自另一个查询的结果



一个简化的 Elasticsearch 索引 'articles' 包含字段domain_nametag的文档,以及一些其他内容。

tag仅限于少数关键字值,例如source1source2,其中tag在每个文档中只能有一个值。domain_name是每个文档中的单个值

我想返回一组文档,其中tag=source1不包括来自另一个查询的domain_name,其中tag=source2

分两步,如下所示:

设置为排除

{
"query": {
"term" : { "tag" : "source2" } 
}
}

将处理结果以生成一个domain_name值数组,每个返回的文档一个。

然后,第二个查询将获取它关心的所有项目,然后排除它不关心的术语(上一个查询中的域名列表(。

查询减号设置为排除

{
"query": {
"bool": {
"must": {
"term" : { "tag" : "source1" } 
},
"must_not": {
"terms": {
"tag": [<array of domain_name values>]
}
}
}
}
}

这是否可以在单个查询中或使用聚合?索引和结果集不会很大,所以我不太担心性能,而是担心便利性。

奖励问题,这可以直接在 Kibana 中定义吗?

就我而言,我使用编程语言(Java(执行第一个查询并通过第一个查询获取文档的结果数组,然后我将查询结果的ID存储在数组中,并使用包含第一个查询ID的数组来执行第二个查询 弹性不支持嵌套查询

为避免两次调用,请使用嵌套查询或 (has_child 和 has_parent( 查询。 参考 Elasticsearch 文档

最新更新