如何获得ES索引每个术语的出现次数和doc_count?

时间:2019-05-22 17:58:58

标签: elasticsearch elastic-stack elasticsearch-aggregation

我的ES索引格式为

{
  "adminfile" : {
    "mappings" : {
      "properties" : {
        "text" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

其中“ title”字段是在“ text”字段中找到的字符串的标题。标题不包含任何空格,而文本是普通文本(带有空格和点的句子等)。

我想获取索引中的所有术语及其doc_count和/或频率。我在ES文档中找到了此查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

GET /adminfile/_search
{
    "size": 10,
    "aggs" : {
        "text" : {
            "terms" : {
                "field" : "text.keyword",
                "order" : { "_count" : "asc" },
                "size": 10
            }
        }
    }
}

这将返回所有源,但聚合存储桶为空。如果我在该命令中将“ text.keyword”更改为“ title.keyword”,它将起作用并返回所有标题作为键。

为什么它在文本字段上不起作用?

是否有更好的命令使用?我知道这:

GET /adminfile/_search
{
    "query" : {
        "match" : {"text" : "WordToSearch"}
    },
    "_source":false,
    "aggregations": {
        "keywords" : {
            "significant_text" : {
                "field" : "text",
                "filter_duplicate_text": true,
                "size": 100
            }
        }
    },
    "highlight": {
        "fields": {
            "text": {}
        }
    }
}

可以获取索引的每个文档中wordToSearch的所有出现次数以及计数和频率。有没有办法让此命令匹配每个文档的每个单词?

编辑:我还曾尝试将文本字段的名称更改为“ contenu”,以防ES不喜欢具有名称为“ text”且类型为“ text”的字段。没有效果。

另一种选择可能是使用https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html,但_termvectors仅适用于一个特定的ID(或_mtermvectors适用于多个特定的ID,无论如何都不适用于所有文档)

EDIT2:我意识到ignore_above可能是一个问题。我尝试将所有文​​字切成200个字符作为测试。查询现在可以运行,只不过它返回整个文本作为键,而不是将其切成单词。

1 个答案:

答案 0 :(得分:0)

使用字段的keyword版本时,内容将作为单个大令牌保留。您以为ignore_above是问题的根源是正确的,因为这些标记在数据集中显然比256个字符长。

如果您改为跨标记化字段(普通文本字段)而不是keyword版本进行汇总,则将获得该字段处理的每个单词(即每个标记)的计数。