更改字段属性
Changing field properties
我正在使用 packetbeat 监控 3306 上的 mysql 端口,它工作得很好。
我可以轻松地在发现选项卡上搜索任何单词。例如
method:SET
这按预期工作。但是如果我把它改成
query:SET
那么它不会 return 查询字段中包含单词 "SET" 的文档。查询字段的索引是否不同?
如何使 "query" 字段可搜索?
更新:
这是因为参数 "ignore_above" 用于所有字符串字段吗?我使用 API...
检查了映射
GET /packetbeat-2018.02.01/_mapping/mysql/
如何取消此限制并使所有未来的节拍成为索引查询字段?
更新 2:
如果我在基于 "query" 字段的搜索中提及整个字符串,它会按预期工作...
query:"SELECT name, type, comment FROM mysql.proc WHERE name like 'residentDetails_get' and db <=> 'portal' ORDER BY name, type"
这 return 是过去 15 分钟内的所有 688 条记录。当我搜索以下内容时,我希望得到更多...
query:"SELECT"
但是我没有得到一条记录。我猜这是因为文档的索引方式。我更愿意取回 SQL 的等价物:像 '%SELECT%'
这样的查询
packetbeat的查询字段声明为"keyword"。因此,您只能搜索整个查询。例如
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`.
考虑到字段的查询和映射,这是正确的行为。这与 1024 的限制无关。您可以省略 query:
部分,以便 Elasticsearch 将使用 _all
字段(将在不久的将来删除),但这里取决于您使用的 Stack 版本。
或者,更好更正确的方法是在 packetbeat 模板中以不同方式配置查询字段(以便下一个索引将使用新映射)如下所示:
"query": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 1024
}
}
}
主要思想是 ES 不拆分查询字段中的值(因为它是 keyword
),您需要一种方法来执行此操作。您可以使用通配符,但 ES 不喜欢它们(尤其是前导通配符),并且当 运行 这样的查询时您可能会遇到性能问题。 "correct" 从 ES 的角度来看的方法是我已经提到的方法:对字段进行分析,保留它的原始版本(用于排序和聚合)和它的简单版本用于搜索。
我正在使用 packetbeat 监控 3306 上的 mysql 端口,它工作得很好。 我可以轻松地在发现选项卡上搜索任何单词。例如
method:SET
这按预期工作。但是如果我把它改成
query:SET
那么它不会 return 查询字段中包含单词 "SET" 的文档。查询字段的索引是否不同? 如何使 "query" 字段可搜索?
更新:
这是因为参数 "ignore_above" 用于所有字符串字段吗?我使用 API...
检查了映射GET /packetbeat-2018.02.01/_mapping/mysql/
如何取消此限制并使所有未来的节拍成为索引查询字段?
更新 2:
如果我在基于 "query" 字段的搜索中提及整个字符串,它会按预期工作...
query:"SELECT name, type, comment FROM mysql.proc WHERE name like 'residentDetails_get' and db <=> 'portal' ORDER BY name, type"
这 return 是过去 15 分钟内的所有 688 条记录。当我搜索以下内容时,我希望得到更多...
query:"SELECT"
但是我没有得到一条记录。我猜这是因为文档的索引方式。我更愿意取回 SQL 的等价物:像 '%SELECT%'
这样的查询packetbeat的查询字段声明为"keyword"。因此,您只能搜索整个查询。例如
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`.
考虑到字段的查询和映射,这是正确的行为。这与 1024 的限制无关。您可以省略 query:
部分,以便 Elasticsearch 将使用 _all
字段(将在不久的将来删除),但这里取决于您使用的 Stack 版本。
或者,更好更正确的方法是在 packetbeat 模板中以不同方式配置查询字段(以便下一个索引将使用新映射)如下所示:
"query": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 1024
}
}
}
主要思想是 ES 不拆分查询字段中的值(因为它是 keyword
),您需要一种方法来执行此操作。您可以使用通配符,但 ES 不喜欢它们(尤其是前导通配符),并且当 运行 这样的查询时您可能会遇到性能问题。 "correct" 从 ES 的角度来看的方法是我已经提到的方法:对字段进行分析,保留它的原始版本(用于排序和聚合)和它的简单版本用于搜索。