elasticsearch 如何获取opensearch索引中包含唯一词的文档数量

uidvcgyl  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(2)|浏览(165)

假设我有一个索引test_index,它包含两个文档:
1.敏捷的棕色狐狸跳过懒狗
1.有一只棕色的狐狸
我想写一个查询,它可以显示所有唯一字的文档计数。所以输出将是这样的:

  1. The - 1
    1.快速-1
    1.棕-2
    1.福克斯-2
    1.跳跃- 1

    在opensearch中应该编写什么查询来实现这一点
z9zf31ra

z9zf31ra1#

不确定是否有一个可能的查询来实现该结果,但要获得您特别想要的某些单词的频率,您可以使用术语向量并获得最频繁的单词。
将term_statistics设置为true(默认值为false)将返回

  • 总术语频率(术语在所有文档中出现的频率)
  • 文档频率(包含当前术语的文档数量)
yc0p9oo0

yc0p9oo02#

一种以统一的方式实现这一点的方法是在文本字段上启用fielddata
假设你有一个名为contenttext类型的字段,它包含你想要分析的数据,那么你需要像这样修改你的Map:

PUT test/_mapping
{
  "properties": {
    "content": {
      "type": "text",
      "fielddata": true
    }
  }
}

然后,您可以在该字段上运行terms聚合,如下所示:

POST test/_search
{
  "size": 0,
  "aggs": {
    "usage": {
      "terms": {
        "field": "content",
        "size": 10
      }
    }
  }
}

你会得到你所期望的:

{
  "aggregations" : {
    "usage" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 1,
      "buckets" : [
        {
          "key" : "brown",
          "doc_count" : 2
        },
        {
          "key" : "fox",
          "doc_count" : 2
        },
        {
          "key" : "a",
          "doc_count" : 1
        },
        {
          "key" : "dog",
          "doc_count" : 1
        },
        {
          "key" : "jumps",
          "doc_count" : 1
        },
        {
          "key" : "lazy",
          "doc_count" : 1
        },
        {
          "key" : "over",
          "doc_count" : 1
        },
        {
          "key" : "quick",
          "doc_count" : 1
        },
        {
          "key" : "the",
          "doc_count" : 1
        },
        {
          "key" : "there",
          "doc_count" : 1
        }
      ]
    }
  }
}

注意,但是,强烈建议不要这样做,因为字段数据加载在内存中,并且根据您运行此操作的数据量,这可能会占用大量内存。

相关问题