Картографирование массива (текст, данные) в Elasticsearch Kibana - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь опубликовать эти теги:

POST dicom1/_doc/1
        {
          "(0008,0005)": ["SpecificCharacterSet", "ISO_IR 100"], 
          "(0008,0008)": ["ImageType", "ORIGINAL"], 
          "(0008,0020)": ["StudyDate", "2002-04-01"],
          "(0008,0023)": ["ContentDate", "2002-04-01"],
    ... 
    }

Но я получаю это исключение:

"type": "illegal_argument_exception",
        "reason": "mapper [(0008,0020)] of different type, current_type [date], merged_type [text]"

Итак, я попытался:

PUT dicom1
{
  "mappings": {
    "_doc":{
    "properties": {
      "(0008,0020)": {
        "type": ["text","date"],
      },
      "(0008,0023)": {
        "type": ["text" ,"date"],
      },
...

Но там написано "Bad String" Как я могу опубликовать свой json, не меняя структуру?

1 Ответ

0 голосов
/ 23 марта 2020

DICOM имеет ряд стандартов, касающихся порядка именования изображений go.

То, что вы имеете в качестве массива, само по себе является ключом-значением. По сути, у вас есть нечто, называемое tag, tag name и value для этого конкретного изображения.

Короче говоря, вы можете сказать, что у вас есть кортежи. Например,

tag - "(0008,0020)"
tag_name - "StudyDate"
tag_value - 2004-01-01

Я придумал приведенный ниже дизайн для изображений DICOM, и мне нравится думать, что он будет работать для большинства сценариев использования. Ниже приведено сопоставление, примеры документов, запрос и ответ в том виде, в котором он выглядит:

Сопоставление:

PUT dicom
{
  "mappings": {
    "properties": {
      "dicom_tags_text":{
        "type": "nested",
        "properties": {
          "tag": {
            "type": "keyword"
          },
          "tag_name": {
            "type": "keyword"
          },
          "tag_value":{
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          }
        }
      },
      "dicom_tags_date":{
        "type": "nested",
        "properties": {
          "tag": {
            "type": "keyword"
          },
          "tag_name": {
            "type": "keyword"
          },
          "tag_value":{
            "type": "date",
            "format": "yyyy-MM-dd"
          }
        }
      }
    }  
  }
}

Ниже приведены некоторые концепции, которые я использовал

Каждое изображение будет иметь две категории данных: с полем text и с полем date. Вы можете добавить больше полей в зависимости от того, хотите ли вы сохранить какой-либо другой формат данных.

Обратите внимание, что для простоты я использовал ключевое слово для строковых данных. Это потому, что они используются для точного соответствия. Вы также можете использовать text данные, но, пожалуйста, потратьте некоторое время, чтобы понять разницу между ними.

Образцы документов:

POST dicom/_doc/1
{
  "dicom_tags_text": [
    {
      "tag": "(0008,0005)",
      "tag_name": "SpecificCharacterSet",
      "tag_value": "ISO_IR 100"
    },
    {
      "tag": "(0004,1511)",
      "tag_name": "SOPInstanceId",
      "tag_value": "1001"
    }
  ],
  "dicom_tags_date": [
    {
      "tag": "(0008,0020)",
      "tag_name": "StudyDate",
      "tag_value": "2002-04-01"
    },
    {
      "tag": "(0008,0023)",
      "tag_name": "ContentDate",
      "tag_value": "2002-04-01"
    }  
  ]
}

POST dicom/_doc/2
{
  "dicom_tags_text": [
    {
      "tag": "(0008,0005)",
      "tag_name": "SpecificCharacterSet",
      "tag_value": "ISO_IR 100"
    },
    {
      "tag": "(0004,1511)",
      "tag_name": "SOPInstanceId",
      "tag_value": "1004"
    }
  ],
  "dicom_tags_date": [
    {
      "tag": "(0008,0020)",
      "tag_name": "StudyDate",
      "tag_value": "2020-01-01"
    }  
  ]
}

Обратите внимание, что я создал два документа выше, и обратите внимание, как я их создал. Вы можете проверить это с помощью сопоставления, чтобы понять сопоставление в первую очередь.

Запрос запроса:

Теперь предположим, что ваш вариант использования состоит в том, чтобы получить все документы с кодировкой ISO_IR 100 с выполнением StudyDate после 2019-01-01.

Ниже приведен запрос:

POST dicom/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "dicom_tags_text",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "dicom_tags_text.tag_name": "SpecificCharacterSet"
                    }
                  },
                  {
                    "match": {
                      "dicom_tags_text.tag_value": "iso ir 100"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "dicom_tags_date",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "dicom_tags_date.tag_name": "StudyDate"
                    }
                  },
                  {
                    "range": {
                      "dicom_tags_date.tag_value": {
                        "gte": "2019-01-01"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

Обратите внимание, что для типа данных nested нам необходимо использовать nested queries. Я использовал Term Query для ключевых слов типов и использовал простое Match Query для text . Пожалуйста, прочитайте вышеупомянутые ссылки, чтобы понять больше об этом.

Ниже приведен ответ:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 2.4854383,
    "hits" : [
      {
        "_index" : "dicom",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 2.4854383,
        "_source" : {
          "dicom_tags_text" : [
            {
              "tag" : "(0008,0005)",
              "tag_name" : "SpecificCharacterSet",
              "tag_value" : "ISO_IR 100"
            },
            {
              "tag" : "(0004,1511)",
              "tag_name" : "SOPInstanceId",
              "tag_value" : "1004"
            }
          ],
          "dicom_tags_date" : [
            {
              "tag" : "(0008,0020)",
              "tag_name" : "StudyDate",
              "tag_value" : "2020-01-01"
            }
          ]
        }
      }
    ]
  }
}

Дайте мне знать, если это то, что вам поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...