IP 字段类型

编辑

ip 字段可以索引/存储 IPv4IPv6 地址。

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "ip_addr": {
                "type": "ip"
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "ip_addr": "192.168.1.1"
    },
)
print(resp1)

resp2 = client.search(
    index="my-index-000001",
    query={
        "term": {
            "ip_addr": "192.168.0.0/16"
        }
    },
)
print(resp2)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        ip_addr: {
          type: 'ip'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    ip_addr: '192.168.1.1'
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      term: {
        ip_addr: '192.168.0.0/16'
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      ip_addr: {
        type: "ip",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    ip_addr: "192.168.1.1",
  },
});
console.log(response1);

const response2 = await client.search({
  index: "my-index-000001",
  query: {
    term: {
      ip_addr: "192.168.0.0/16",
    },
  },
});
console.log(response2);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "ip_addr": {
        "type": "ip"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "ip_addr": "192.168.1.1"
}

GET my-index-000001/_search
{
  "query": {
    "term": {
      "ip_addr": "192.168.0.0/16"
    }
  }
}

您还可以使用 ip_range 数据类型在单个字段中存储 IP 范围。

ip 字段的参数

编辑

ip 字段接受以下参数

doc_values
是否应以列式方式将字段存储在磁盘上,以便稍后用于排序、聚合或脚本?接受 true(默认)或 false
ignore_malformed
如果为 true,则会忽略格式错误的 IP 地址。如果为 false(默认),则格式错误的 IP 地址会引发异常并拒绝整个文档。请注意,如果使用了 script 参数,则不能设置此参数。
index
该字段是否应可快速搜索?接受 true(默认)和 false。仅启用 doc_values 的字段仍然可以使用基于 term 或范围的查询进行查询,尽管速度较慢。
null_value
接受 IPv4 或 IPv6 值,该值将替换任何显式的 null 值。默认为 null,这意味着该字段被视为缺失。请注意,如果使用了 script 参数,则不能设置此参数。
on_script_error
定义在由 script 参数定义的脚本在索引时引发错误时该怎么做。接受 reject(默认),这将导致拒绝整个文档,以及 ignore,这将把该字段注册到文档的 _ignored 元数据字段中并继续索引。只有在设置了 script 字段时才能设置此参数。
script
如果设置了此参数,则该字段将索引由此脚本生成的值,而不是直接从源读取值。如果在输入文档中为此字段设置了值,则将拒绝该文档并出现错误。脚本的格式与其 运行时等效项相同,并且应发出包含 IPv4 或 IPv6 格式地址的字符串。
store
是否应存储字段值并可从 _source 字段单独检索。接受 truefalse(默认)。
time_series_dimension

(可选,布尔值)

将该字段标记为时间序列维度。默认为 false

index.mapping.dimension_fields.limit 索引设置限制索引中维度的数量。

维度字段具有以下约束

  • doc_valuesindex 映射参数必须为 true

查询 ip 字段

编辑

查询 IP 地址最常用的方法是使用 CIDR 表示法:[ip_address]/[prefix_length]。例如

resp = client.search(
    index="my-index-000001",
    query={
        "term": {
            "ip_addr": "192.168.0.0/16"
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      term: {
        ip_addr: '192.168.0.0/16'
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  query: {
    term: {
      ip_addr: "192.168.0.0/16",
    },
  },
});
console.log(response);
GET my-index-000001/_search
{
  "query": {
    "term": {
      "ip_addr": "192.168.0.0/16"
    }
  }
}

resp = client.search(
    index="my-index-000001",
    query={
        "term": {
            "ip_addr": "2001:db8::/48"
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      term: {
        ip_addr: '2001:db8::/48'
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  query: {
    term: {
      ip_addr: "2001:db8::/48",
    },
  },
});
console.log(response);
GET my-index-000001/_search
{
  "query": {
    "term": {
      "ip_addr": "2001:db8::/48"
    }
  }
}

还要注意,冒号是 query_string 查询的特殊字符,因此 IPv6 地址需要转义。最简单的方法是在搜索的值周围加上引号

resp = client.search(
    index="my-index-000001",
    query={
        "query_string": {
            "query": "ip_addr:\"2001:db8::/48\""
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      query_string: {
        query: 'ip_addr:"2001:db8::/48"'
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  query: {
    query_string: {
      query: 'ip_addr:"2001:db8::/48"',
    },
  },
});
console.log(response);
GET my-index-000001/_search
{
  "query": {
    "query_string" : {
      "query": "ip_addr:\"2001:db8::/48\""
    }
  }
}

合成 _source

编辑

合成 _source 仅对 TSDB 索引(将 index.mode 设置为 time_series 的索引)普遍可用。对于其他索引,合成 _source 处于技术预览状态。技术预览中的功能可能会在未来的版本中更改或删除。Elastic 会努力修复任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 的约束。

合成源可以对 ip 字段值进行排序并删除重复项。例如

resp = client.indices.create(
    index="idx",
    settings={
        "index": {
            "mapping": {
                "source": {
                    "mode": "synthetic"
                }
            }
        }
    },
    mappings={
        "properties": {
            "ip": {
                "type": "ip"
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "ip": [
            "192.168.0.1",
            "192.168.0.1",
            "10.10.12.123",
            "2001:db8::1:0:0:1",
            "::afff:4567:890a"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      ip: {
        type: "ip",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    ip: [
      "192.168.0.1",
      "192.168.0.1",
      "10.10.12.123",
      "2001:db8::1:0:0:1",
      "::afff:4567:890a",
    ],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "ip": { "type": "ip" }
    }
  }
}
PUT idx/_doc/1
{
  "ip": ["192.168.0.1", "192.168.0.1", "10.10.12.123",
         "2001:db8::1:0:0:1", "::afff:4567:890a"]
}

将变为

{
  "ip": ["::afff:4567:890a", "10.10.12.123", "192.168.0.1", "2001:db8::1:0:0:1"]
}

IPv4 地址的排序方式就好像它们是前缀为 ::ffff:0:0:0/96 的 IPv6 地址一样,如 rfc6144 中所指定。