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

Elasticsearch术语聚合未返回任何存储桶

仰钧
2023-03-14

此处为elasticsearch新用户,但存在术语聚合问题。我为187份文档编制了索引,其中包含“名称”、“主机”、“风险”等字段。字段风险有4个唯一值(“关键”、“高”、“中”、“低”、“信息”),我正在运行这样的术语聚合:

POST http://localhost:9200/{index_name}/_search?size=0

{
    "aggs":{
        "riskCount":{
            "terms":{ 
                "field":"risk.keyword"
                }
        }
    }
}

我希望得到一个结果,说明我有x个临界值,x个高值等等。问题是,我没有得到返回的桶。

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 187,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    },
    "aggregations": {
        "riskCount": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
        }
    }
}

我的Elasticsearch版本是7.12.0有什么想法吗

>

  • 编辑:这是映射:

    "findings": {
         "mappings": {
             "properties": {
                 "date_uploaded": {
                     "type": "date"
                 },
                 "host": {
                     "type": "text"
                 },
                 "name": {
                     "type": "text"
                 },
                 "risk": {
                     "type": "text"
                 }
             }
         }
     }
    

    以下是文件:

    {
        "took": 1,
        "timed_out": false,
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": {
                "value": 187,
                "relation": "eq"
            },
            "max_score": 1.0,
            "hits": [
                {
                    "_index": "findings",
                    "_type": "_doc",
                    "_id": "f86b6b5b-f09e-4350-9a66-d88a3a78f640",
                    "_score": 1.0,
                    "_source": {
                        "risk": "Informational",
                        "name": "HTTP Server Type and Version",
                        "host": "10.10.9.10",
                        "date_uploaded": "2021-05-07T19:39:10.810663+00:00"
                    }
                }
            ]
        }
    }
    
  • 共有2个答案

    姜钧
    2023-03-14

    您没有任何风险。映射中的关键字字段。您需要如下更改映射。只需运行以下命令来更新映射并创建风险。关键字子字段:

    PUT index-name/_mapping
    {
          "properties": {
            "date_uploaded": {
              "type": "date"
            },
            "host": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword"
                }
              }
            },
            "name": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword"
                }
              }
            },
            "risk": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword"
                }
              }
            }
          }
    }
    

    然后使用以下命令重新索引您的数据:

    POST index-name/_update_by_query
    

    然后可以按如下方式运行查询:

    {
        "aggs":{
            "riskCount":{
                "terms":{ 
                    "field":"risk.keyword"
                }
            }
        }
    }
    
    邹嘉致
    2023-03-14

    由于风险字段是text类型,因此您需要将索引映射更新为

    PUT /_mapping
    {
      "properties": {
        "risk": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
    

    然后运行update\u by\u查询API来重新索引数据

     类似资料:
    • 问题内容: 我正在尝试使用以下查询对以下数据进行elasticsearch来执行术语聚合,输出将名称分解为标记(请参见下面的输出)。因此,我尝试将os_name映射为multi_field,但现在无法通过它查询。是否可以有没有令牌的索引?例如“ Fedora Core”? 查询: 数据: 输出: 映射: 问题答案: 实际上,您应该像这样更改映射 并且您的aggs应该更改为:

    • 我们目前正在开发一个多语言文档CMS。因此,我们有翻译成不同语言的文件。 对于使用Elasticsearch进行搜索,我们目前使用每种语言(德语、英语、法语……)一个索引,其中同一文档的所有翻译共享相同的ID。 当用户搜索特定术语时,我们希望在所有语言中搜索,但只返回不同ID的列表。据我所知,只有使用以下术语聚合才能做到这一点: 这很好,但是作为弹性搜索文档https://www.elastic.

    • 我想根据top hits聚合中第一个元素所拥有的属性,从terms聚合中订购Bucket。 我的尽力而为查询如下(有语法错误): 有人知道如何做到这一点吗? 例子: 按“a”分组,按“id”(desc)排序存储桶,并按“b”(desc)排序最热门的内容,将给出:

    • 问题内容: 我有两种日志消息: 第一个消息是已发送消息的类型,第二个消息是确认消息已传递的消息。 它们之间的区别是后缀,我已将其与“ id”分开并可以对其进行查询。 这些消息将按以下格式解析并存储在elasticsearch中: 我想找出哪些消息已成功发送,哪些没有成功。我是Elasticsearch的初学者,所以我真的很努力。 我目前正在尝试术语聚合,但是我所能实现的就是以下代码: 向我显示已发

    • 我有一个存储字符串数组的字段。不同的文档包含不同的字符串集。 现在,我使用这个聚合查询来分析每个文件类型的使用情况。 结果与预期一致。但最近我在删除XML文件支持后更新了此字段。因此,文档的non具有文件类型XML。我可以从这个查询中确认这一点。 总命中计数为零。奇怪的是,当我再次执行上述聚合查询时,我仍然可以将XML视为一个术语。doc count为零。 如果这个XML术语在任何文档中都不存在,

    • 问题内容: 我需要计算管道聚合返回的结果集中的存储桶数。问题是我的查询在这里使用脚本选择器: 返回类似这样的内容: 在该键下,我可以看到一个满足我条件的访问者列表(由标识的每个访问者都必须在索引中恰好有三个文档),但这不是很有用,因为它可以处理成千上万的访问者。我正在使用PHP处理结果,从理论上讲,它可以计算结果集,但是对于大量的访问者来说,这并不是最好的主意。有没有一种方法可以仅在和旁边输出有效