弹性查询,以查找来自不同组织的内容中的类似标记

时间:2017-03-09 10:02:25

标签: elasticsearch

我使用来自不同组织的内容源,这些组织都提供元数据标签。我想要一个由不同组织提供的术语列表。

Elasticsearch中的数据样本:

doc1: {
    "tags":["tag1", "tag5", "tag6", "tag4"],
    "organization" : "A"
}

doc2: {
    "tags":["tag1", "tag2", "tag4"],
    "organization" : "B"
} 

所需的查询结果:

{
   "tag": "tag1",
   "organization" : ["A", "B"]
},

{
   "tag": "tag4",
   "organization" : ["A", "B"]
}

到目前为止我得到了什么

根据下面的建议,我得到了一个结果列表,其中包含一个组织使用的关键字以及不同组织使用的关键字。

澄清一下,这是结果的一部分:

     {
      "key": "someKeyWord",
      "doc_count": 66,
      "organization_list": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "Organization A",
            "doc_count": 62
          },
          {
            "key": "Organization B",
            "doc_count": 4
          }
        ]
      }
    },
    {
      "key": "someOtherKeyword",
      "doc_count": 62,
      "organization_list": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "Organization A",
            "doc_count": 62
          }
        ]
      }
    }

现在我只想要第一个结果,它有来自organization_list聚合的两个桶。因为该关键字由两个不同的组织使用。

我试过这样:

    "number_buckets_filter": {
        "bucket_selector": {
            "buckets_path": {
                "my_var": "organization_list"
             },
             "script": "params.my_var > 1"
        }
    }

但这让我有一个例外:" buckets_path必须引用数值或单值数值度量聚合,得到:org.elasticsearch.search.aggregations.bucket.terms.StringTerms"

有没有办法过滤结果?提前感谢您的帮助。

亲切的问候, Oskar uit de Bos

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询首先在标签上进行存储,然后再到组织上的子存储桶

{
  "size": 0,
  "aggs": {
    "tags_list": {
      "terms": {
        "field": "tags",
        "size": 100
      },"aggs": {
        "organization_list": {
          "terms": {
            "field": "organization",
            "size": 100
          }
        }
      }
    }
  }
}

映射

{
    "mappings": {
        "product": {
            "properties": {
                "tags": {
                    "type": "text",
                    "fielddata": true
                },
                "organization": {
                    "type": "text",
                    "fielddata": true
                }
            }
        }
    }
}

注意 - 确保标记和组织都没有进行聚合分析。还在映射中设置fielddata=true以避免重度内存使用。