0

我正在使用 packetbeat 监控 3306 上的 mysql 端口,它运行良好。我可以轻松地在发现选项卡上搜索任何单词。例如

method:SET

这按预期工作。但是,如果我将其更改为

query:SET

那么它不会返回查询字段中带有“SET”一词的文档。查询字段的索引是否不同?如何使“查询”字段可搜索?


更新:

这是因为用于所有字符串字段的参数“ignore_above”吗?我使用此 API 检查了映射...

GET /packetbeat-2018.02.01/_mapping/mysql/

如何删除此限制并使所有未来节拍索引查询字段?


更新 2:

如果我在基于“查询”字段的搜索中提到整个字符串,它会按预期工作......

query:"SELECT name, type, comment FROM mysql.proc WHERE name like 'residentDetails_get' and db <=> 'portal' ORDER BY name, type"

这将返回过去 15 分钟内的所有 688 条记录。当我搜索以下内容时,我希望得到更多...

query:"SELECT"

但我没有得到一条记录。我想这是因为文档的索引方式。我宁愿取回相当于 SQL 的查询:'%SELECT%' 之类的查询

4

2 回答 2

1

鉴于查询和字段映射,这是正确的行为。这与 1024 的限制无关。您可以省略query:部分,以便 Elasticsearch 将使用该_all字段(将在不久的将来删除),但这取决于您使用的 Stack 版本。

或者,更好更正确的方法是在 packetbeat 模板中以不同的方式配置查询字段(以便下一个索引将使用新的映射),如下所示:

    "query": {
      "type": "text",
      "fields": {
        "raw": {
          "type": "keyword",
          "ignore_above": 1024
        }
      }
    }

主要思想是 ES 不会拆分查询字段中的值(因为它是keyword),您需要一种方法来执行此操作。您可以使用通配符,但 ES 不喜欢它们(尤其是前导通配符),并且在运行此类查询时可能会遇到性能问题。从 ES 的角度来看,“正确”的方法是我已经提到的方法:对字段进行分析,保留它的原始版本(用于排序和聚合)和它的简单版本用于搜索。

于 2018-02-11T06:05:31.540 回答
0

packetbeat 的查询字段被声明为“关键字”。因此,您只能搜索整个查询。例如

query: "select * from mytable"

但是如果我们需要搜索query: "mytable"怎么办?您需要通过修改 fields.yml 文件使查询字段可搜索。将type:text参数添加到 /etc/packetbeat 中 fields.yml 文件的 MySQL 部分的查询字段

文件的相关部分将如下所示...

- name: query
  type: text
  description: >
    The query in a human readable format. For HTTP, it will typically be
    something like `GET /users/_search?name=test`. For MySQL, it is
    something like `SELECT id from users where name=test`.
于 2018-02-10T17:01:34.363 回答