Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Отображение ›Типы данных полей

Тип поля IP

Поле типа ip может индексировать/хранить адреса IPv4 или IPv6.

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-адресов в одном поле, используя тип данных ip_range.

Параметры для полей ip

Следующие параметры принимаются полями типа ip:

doc_values
Необходимо ли хранить поле на диске в колонковом формате, чтобы его можно было использовать для сортировки, агрегаций или сценариев? Принимает значения true (по умолчанию) или false.
ignore_malformed
Если значение true, некорректные IP-адреса игнорируются. Если значение false (по умолчанию), некорректные IP-адреса вызывают исключение и отбрасывают весь документ. Обратите внимание, что это значение нельзя установить, если используется параметр script.
index
Необходимо ли быстро искать по полю? Принимает значения true (по умолчанию) и false. Поля, у которых включен только параметр doc_values, всё ещё могут быть запрошены с помощью запросов на основе термов или диапазонов, хотя и медленнее.
null_value
Принимает значение IPv4 или IPv6, которое используется как подстановка для явных значений null. По умолчанию null, что означает, что поле считается отсутствующим. Обратите внимание, что это значение нельзя установить, если используется параметр script.
on_script_error
Определяет, что делать, если скрипт, определенный параметром script, генерирует ошибку при индексировании. Принимает значение reject (по умолчанию), которое приведет к отклонению всего документа, и ignore, которое зарегистрирует поле в метаданных документа с полем _ignored и продолжит индексирование. Этот параметр может быть установлен только если установлен параметр script.
script
Если этот параметр установлен, поле будет индексировать значения, сгенерированные этим скриптом, а не считывать значения напрямую из источника. Если для этого поля установлено значение в документе-входе, документ будет отклонен с ошибкой. Скрипты имеют тот же формат, что и их эквиваленты runtime, и должны выводить строки с адресами в формате 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 будет работать над исправлением любых проблем, но функции в техническом предварительном просмотре не подпадают под SLA поддержки официальных функций GA.

Синтетический источник может сортировать значения поля 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-адреса сортируются так, как если бы они были IPv6-адресами с префиксом ::ffff:0:0:0/96, как указано в rfc6144.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/ip.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API