ignore_malformed

時には、受け取るデータをあまり制御できないことがあります。あるユーザーは、[login]フィールドをdateとして送信し、別のユーザーはloginフィールドをメールアドレスとして送信します。

間違ったデータ型をフィールドにインデックスしようとすると、デフォルトで例外がスローされ、ドキュメント全体が拒否されます。ignore_malformedパラメータがtrueに設定されている場合、例外を無視することができます。誤った形式のフィールドはインデックスされませんが、ドキュメント内の他のフィールドは通常通り処理されます。

例えば:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "number_one": {
  6. "type": "integer",
  7. "ignore_malformed": True
  8. },
  9. "number_two": {
  10. "type": "integer"
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.index(
  17. index="my-index-000001",
  18. id="1",
  19. document={
  20. "text": "Some text value",
  21. "number_one": "foo"
  22. },
  23. )
  24. print(resp1)
  25. resp2 = client.index(
  26. index="my-index-000001",
  27. id="2",
  28. document={
  29. "text": "Some text value",
  30. "number_two": "foo"
  31. },
  32. )
  33. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. number_one: {
  7. type: 'integer',
  8. ignore_malformed: true
  9. },
  10. number_two: {
  11. type: 'integer'
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.index(
  19. index: 'my-index-000001',
  20. id: 1,
  21. body: {
  22. text: 'Some text value',
  23. number_one: 'foo'
  24. }
  25. )
  26. puts response
  27. response = client.index(
  28. index: 'my-index-000001',
  29. id: 2,
  30. body: {
  31. text: 'Some text value',
  32. number_two: 'foo'
  33. }
  34. )
  35. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. number_one: {
  6. type: "integer",
  7. ignore_malformed: true,
  8. },
  9. number_two: {
  10. type: "integer",
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.index({
  17. index: "my-index-000001",
  18. id: 1,
  19. document: {
  20. text: "Some text value",
  21. number_one: "foo",
  22. },
  23. });
  24. console.log(response1);
  25. const response2 = await client.index({
  26. index: "my-index-000001",
  27. id: 2,
  28. document: {
  29. text: "Some text value",
  30. number_two: "foo",
  31. },
  32. });
  33. console.log(response2);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "number_one": {
  6. "type": "integer",
  7. "ignore_malformed": true
  8. },
  9. "number_two": {
  10. "type": "integer"
  11. }
  12. }
  13. }
  14. }
  15. PUT my-index-000001/_doc/1
  16. {
  17. "text": "Some text value",
  18. "number_one": "foo"
  19. }
  20. PUT my-index-000001/_doc/2
  21. {
  22. "text": "Some text value",
  23. "number_two": "foo"
  24. }
このドキュメントにはtextフィールドがインデックスされますが、number_oneフィールドはインデックスされません。
このドキュメントは、number_twoが誤った値を許可しないため、拒否されます。
  1. - [Numeric](/read/elasticsearch-8-15/8d530a3459b86d80.md)
  2. - `````long`````, `````integer`````, `````short`````, `````byte`````, `````double`````, `````float`````, `````half_float`````, `````scaled_float

ignore_malformed設定値は、update mapping APIを使用して既存のフィールドで更新できます。

Index-level default

  1. #### Python
  2. ``````python
  3. resp = client.indices.create(
  4. index="my-index-000001",
  5. settings={
  6. "index.mapping.ignore_malformed": True
  7. },
  8. mappings={
  9. "properties": {
  10. "number_one": {
  11. "type": "byte"
  12. },
  13. "number_two": {
  14. "type": "integer",
  15. "ignore_malformed": False
  16. }
  17. }
  18. },
  19. )
  20. print(resp)
  21. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. 'index.mapping.ignore_malformed' => true
  6. },
  7. mappings: {
  8. properties: {
  9. number_one: {
  10. type: 'byte'
  11. },
  12. number_two: {
  13. type: 'integer',
  14. ignore_malformed: false
  15. }
  16. }
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. "index.mapping.ignore_malformed": true,
  5. },
  6. mappings: {
  7. properties: {
  8. number_one: {
  9. type: "byte",
  10. },
  11. number_two: {
  12. type: "integer",
  13. ignore_malformed: false,
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "index.mapping.ignore_malformed": true
  5. },
  6. "mappings": {
  7. "properties": {
  8. "number_one": {
  9. "type": "byte"
  10. },
  11. "number_two": {
  12. "type": "integer",
  13. "ignore_malformed": false
  14. }
  15. }
  16. }
  17. }
number_oneフィールドはインデックスレベルの設定を継承します。
number_twoフィールドはインデックスレベルの設定をオーバーライドしてignore_malformedを無効にします。

Dealing with malformed fields

ignore_malformedがオンになっていると、誤った形式のフィールドはインデックス時に静かに無視されます。可能な限り、誤った形式のフィールドを持つドキュメントの数を抑えることをお勧めします。さもなければ、このフィールドに対するクエリは意味をなさなくなります。Elasticsearchは、特別な_ignoredフィールドに対してexiststerm、またはtermsクエリを使用することで、誤った形式のフィールドを持つドキュメントの数を簡単に確認できます。

Limits for JSON Objects

次のデータ型ではignore_malformedを使用できません:

また、誤ったデータ型のフィールドに送信されたJSONオブジェクトを無視するためにignore_malformedを使用することもできません。JSONオブジェクトは、波括弧"{}"で囲まれた任意のデータであり、ネストされたデータ型、オブジェクトデータ型、および範囲データ型にマッピングされたデータを含みます。

サポートされていないフィールドにJSONオブジェクトを送信すると、Elasticsearchはエラーを返し、ignore_malformed設定に関係なくドキュメント全体を拒否します。