IPフィールドタイプ

ip フィールドは、IPv4 または IPv6 アドレスをインデックス/ストアできます。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "ip_addr": {
  6. "type": "ip"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.index(
  13. index="my-index-000001",
  14. id="1",
  15. document={
  16. "ip_addr": "192.168.1.1"
  17. },
  18. )
  19. print(resp1)
  20. resp2 = client.search(
  21. index="my-index-000001",
  22. query={
  23. "term": {
  24. "ip_addr": "192.168.0.0/16"
  25. }
  26. },
  27. )
  28. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. ip_addr: {
  7. type: 'ip'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.index(
  15. index: 'my-index-000001',
  16. id: 1,
  17. body: {
  18. ip_addr: '192.168.1.1'
  19. }
  20. )
  21. puts response
  22. response = client.search(
  23. index: 'my-index-000001',
  24. body: {
  25. query: {
  26. term: {
  27. ip_addr: '192.168.0.0/16'
  28. }
  29. }
  30. }
  31. )
  32. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. ip_addr: {
  6. type: "ip",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "my-index-000001",
  14. id: 1,
  15. document: {
  16. ip_addr: "192.168.1.1",
  17. },
  18. });
  19. console.log(response1);
  20. const response2 = await client.search({
  21. index: "my-index-000001",
  22. query: {
  23. term: {
  24. ip_addr: "192.168.0.0/16",
  25. },
  26. },
  27. });
  28. console.log(response2);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "ip_addr": {
  6. "type": "ip"
  7. }
  8. }
  9. }
  10. }
  11. PUT my-index-000001/_doc/1
  12. {
  13. "ip_addr": "192.168.1.1"
  14. }
  15. GET my-index-000001/_search
  16. {
  17. "query": {
  18. "term": {
  19. "ip_addr": "192.168.0.0/16"
  20. }
  21. }
  22. }

IP範囲を単一のフィールドに格納することもできます。ip_rangeデータタイプを使用します。

IPフィールドのパラメータ

ip フィールドで受け入れられるパラメータは次のとおりです:

  • doc_values
  • フィールドはディスクに列ストライド方式で保存され、後でソート、集計、またはスクリプトに使用されるべきですか? true (デフォルト) または false を受け入れます。
  • ignore_malformed
  • true の場合、無効なIPアドレスは無視されます。 false (デフォルト) の場合、無効なIPアドレスは例外をスローし、ドキュメント全体を拒否します。 script パラメータが使用されている場合、これは設定できないことに注意してください。
  • index
  • フィールドは迅速に検索可能であるべきですか? true (デフォルト) と false を受け入れます。 doc_values のみが有効なフィールドは、用語または範囲ベースのクエリを使用してもクエリできますが、遅くなります。
  • null_value
  • 明示的な null 値の代わりにIPv4またはIPv6値を受け入れます。 デフォルトは 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]。例えば:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "term": {
  5. "ip_addr": "192.168.0.0/16"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. term: {
  6. ip_addr: '192.168.0.0/16'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. term: {
  5. ip_addr: "192.168.0.0/16",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "term": {
  5. "ip_addr": "192.168.0.0/16"
  6. }
  7. }
  8. }

または

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "term": {
  5. "ip_addr": "2001:db8::/48"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. term: {
  6. ip_addr: '2001:db8::/48'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. term: {
  5. ip_addr: "2001:db8::/48",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "term": {
  5. "ip_addr": "2001:db8::/48"
  6. }
  7. }
  8. }

コロンは query_string クエリに特別な文字であるため、IPv6アドレスはエスケープする必要があります。 最も簡単な方法は、検索する値の周りに引用符を付けることです:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "query_string": {
  5. "query": "ip_addr:\"2001:db8::/48\""
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. query_string: {
  6. query: 'ip_addr:"2001:db8::/48"'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. query_string: {
  5. query: 'ip_addr:"2001:db8::/48"',
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "query_string" : {
  5. "query": "ip_addr:\"2001:db8::/48\""
  6. }
  7. }
  8. }

合成 _source

合成 _source は、一般的にTSDBインデックス(index.modetime_series に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために作業しますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。

ip フィールドは、デフォルト設定で 合成 _source をサポートします。合成 _source は、copy_to または doc_values が無効な場合、一緒に使用できません。

合成ソースは常に ip フィールドをソートし、重複を削除します。例えば:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. },
  7. "properties": {
  8. "ip": {
  9. "type": "ip"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="idx",
  17. id="1",
  18. document={
  19. "ip": [
  20. "192.168.0.1",
  21. "192.168.0.1",
  22. "10.10.12.123",
  23. "2001:db8::1:0:0:1",
  24. "::afff:4567:890a"
  25. ]
  26. },
  27. )
  28. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. ip: {
  10. type: 'ip'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'idx',
  19. id: 1,
  20. body: {
  21. ip: [
  22. '192.168.0.1',
  23. '192.168.0.1',
  24. '10.10.12.123',
  25. '2001:db8::1:0:0:1',
  26. '::afff:4567:890a'
  27. ]
  28. }
  29. )
  30. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. ip: {
  9. type: "ip",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "idx",
  17. id: 1,
  18. document: {
  19. ip: [
  20. "192.168.0.1",
  21. "192.168.0.1",
  22. "10.10.12.123",
  23. "2001:db8::1:0:0:1",
  24. "::afff:4567:890a",
  25. ],
  26. },
  27. });
  28. console.log(response1);

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "ip": { "type": "ip" }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "ip": ["192.168.0.1", "192.168.0.1", "10.10.12.123",
  13. "2001:db8::1:0:0:1", "::afff:4567:890a"]
  14. }

次のようになります:

コンソール-結果

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

IPv4アドレスは、rfc6144 で指定されたように、IPv6アドレスの前に ::ffff:0:0:0/96 が付けられているかのようにソートされます。