IP 字段类型
编辑IP 字段类型
编辑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
字段单独检索。接受true
或false
(默认)。 -
time_series_dimension
-
(可选,布尔值)
将该字段标记为时间序列维度。默认为
false
。index.mapping.dimension_fields.limit
索引设置限制索引中维度的数量。维度字段具有以下约束
doc_values
和index
映射参数必须为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 中所指定。