elasticsearch Elasticsearch查询排除其他查询的结果,elasticsearch,kibana,elasticsearch,Kibana" /> elasticsearch Elasticsearch查询排除其他查询的结果,elasticsearch,kibana,elasticsearch,Kibana" />

elasticsearch Elasticsearch查询排除其他查询的结果

elasticsearch Elasticsearch查询排除其他查询的结果,elasticsearch,kibana,elasticsearch,Kibana,“文章”的简化Elasticsearch索引包含带有字段域名和标签的文档,以及一些其他内容 tag仅限于少数几个关键字值,例如source1,source2,其中tag在每个文档中只能有一个值域名是每个文档中的单个值 我想从另一个查询返回一组文档,其中tag=source1不包括域名,其中tag=source2 分两步进行,如下所示: 设置为排除 { "query": { "term" : { "tag" : "source2" } } } { "query": {

“文章”的简化Elasticsearch索引包含带有字段
域名
标签
的文档,以及一些其他内容

tag
仅限于少数几个关键字值,例如
source1
source2
,其中
tag
在每个文档中只能有一个值<代码>域名是每个文档中的单个值

我想从另一个查询返回一组文档,其中
tag=source1
不包括
域名
,其中
tag=source2

分两步进行,如下所示:

设置为排除

{
  "query": {
    "term" : { "tag" : "source2" } 
  }
}
{
  "query": {
    "bool": {
      "must": {
        "term" : { "tag" : "source1" } 
      },
      "must_not": {
        "terms": {
          "tag": [<array of domain_name values>]
        }
      }
    }
  }
}
将对结果进行处理以生成一个
域名
值数组,每个返回的文档一个值

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

查询要排除的减号集

{
  "query": {
    "term" : { "tag" : "source2" } 
  }
}
{
  "query": {
    "bool": {
      "must": {
        "term" : { "tag" : "source1" } 
      },
      "must_not": {
        "terms": {
          "tag": [<array of domain_name values>]
        }
      }
    }
  }
}
{
“查询”:{
“布尔”:{
“必须”:{
“term”:{“tag”:“source1”}
},
“不得”:{
“条款”:{
“标记”:[]
}
}
}
}
}
在单个查询中,或者使用聚合,这是可能的吗?索引和结果集不会太大,所以我更担心的是方便,而不是性能


还有一个问题,这可以直接在Kibana中定义吗?

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

要避免两次调用,请使用嵌套查询或(has_child和has_parent)查询。
请参考Elasticsearch,我认为ES不支持某些类型的嵌套查询并不完全正确。例如,术语查找允许一个文档中属性的列表提供术语查询:。我希望我错过了其他类型的查询、评分或聚合。如果您有字段值,可以使用术语,但在您的情况下,您的值将来自另一个单独的查询结果,然后使用它再次查询并非我希望的答案,但它似乎是正确的。Thank.has_child和has_parent仅在存储的数据具有联接或嵌套类型的字段时才支持。