我们有一个带有关键字字段的索引,该字段通常是 IP 地址,但并非总是如此。我们希望不仅可以使用关键字,还可以使用 CIDR 表示法来搜索该字段上的索引,该表示法仅支持“ip”类型的字段。从表面上看,这看起来像是多领域的用例。
来自https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html:
为了不同的目的以不同的方式对同一字段建立索引通常很有用。这就是多领域的目的
所以看来下面的映射对我们来说是有意义的:
{
"mappings": {
"my_field": {
"type": "keyword"
"fields": {
"ip": {
"type": "ip"
"ignore_malformed": true
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我们的应用程序有一组非 IP 地址、IP 地址和 CIDR 表示法块/IP 地址范围并需要通过它们进行查询时,我假设应用程序会将该组拆分为包含非 IP 地址的一组另一个带有 ip 地址/CIDR 表示法块,并在我的查询中从中创建两个单独的术语过滤器,如下所示:
{
"query": {
"bool": {
"filter": [
{
"terms": {
"my_field.ip": [
"123.123.123.0/24",
"192.168.0.1",
"192.168.16.255",
"192.169.1.0/24"
]
}
},
{
"terms": {
"my_field": [
"someDomain.com",
"notAnIp.net"
]
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是多字段的正确使用吗?我们应该通过其他方式实现这一目标吗?它与使用多字段给出的示例不同,因为它实际上是字段值的子集,而不是全部,因为我使用ignore_malformed 来丢弃子字段中的非 IP 地址。如果有更好的方法,那是什么?
归档时间: |
|
查看次数: |
7138 次 |
最近记录: |