当前位置: 首页 > 知识库问答 >
问题:

如何获取ES指数每个项的出现次数和doc_count?

益光亮
2023-03-14

我有一个形式的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出现在每个文件的索引,计数和频率。有没有办法让这个命令匹配每个doc的每个单词?

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

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

编辑2:我意识到ignore_above可能是个问题。作为测试,我尝试将所有文本剪切为200个字符。查询现在正在运行,除了它将整个文本作为键返回,而不是将其剪切为单词。

共有1个答案

慕学海
2023-03-14

当您使用字段的< code>keyword版本时,内容被保存为单个大型标记。您认为< code>ignore_above是问题的根源是正确的,因为在您的数据集中,这些标记显然会超过256个字符。

如果您改为跨标记化字段(普通文本字段)聚合,而不是关键字版本,您将获得该字段处理的每个单词(即每个标记)的计数。

 类似资料:
  • 问题内容: 给定字符串: 如何获得每个字符的出现次数? 问题答案: 效率不高,但是只有一行…

  • 问题内容: 我有一个数组如下 预期结果 尝试如下 问题答案: 无需使用jQuery即可完成此任务-此示例将构建一个对象,其中包含数组中每个不同元素的出现次数

  • 问题内容: 如果我有英文文章或英文小说,并且想计算每个单词出现多少次,用Java编写的最快算法是什么? 有人说您可以使用Map ()完成此操作,但我想知道如何知道关键字是什么?每篇文章都有不同的词,您如何知道“关键”词,然后在其数量上加上一个? 问题答案: 这个数字“我是”只是一个字

  • 本文向大家介绍C++计算每个字符出现的次数,包括了C++计算每个字符出现的次数的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++计算每个字符出现的次数的实现代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助。

  • 问题内容: 有什么方法可以计算数组中每个项目的出现? 可以说我有: 这里的输出将是: 如果我有: 输出为: 这里的输出只是为了展示预期的结果。 问题答案: 你可以使用来自Google Collections / Guava的或来自Apache Commons的。 如果你有一个集合而不是一个数组,则可以用于addAll()将整个内容添加到上述数据结构中,然后将该方法应用于每个值。一个或会给你以定义的

  • 我有一个7x12的2d数组。我一直在研究如何获得它的每一列和每一行的总和,并将每个结果放入列表中,一个是每列总和的结果,另一个是每个行的结果。 因此,对于列,我想将每列的结果保存在一个临时整数变量中,在每一行中使用“a”进行迭代,当“a”等于12(即行数)时,然后检查“p”(即列数)是否等于7并退出循环(这意味着每列的总和已添加到新数组中),如果不是这样,则临时变量将被添加到新数组中,临时变量和“