Запрос Elasticsearch Shape для поиска ограничивающего многоугольника и цвета фона из Nested JSON (ответ Google OCR) - PullRequest
3 голосов
/ 05 апреля 2020

У меня есть ответ от приложения OCR, который JSON похож на ответ Google Vision OCR. Я хочу поместить это в Elasticsearch для выполнения запроса формы. Хотя я могу поставить JSON в Elasticsearch, я не могу придумать идеальные schema и mapping для выполнения поиска на основе формы или boundingPoly и bgColor .

Я довольно новичок в Elasticsearch и у меня есть несколько вопросов.

(1) Как мне выполнить поиск на основе boundingPoly и bgColor?

(2) Нужно ли мне изменять схему для выполнения поиска или я могу оставить ее как есть? Какая лучшая схема и отображение соответствуют моим целям?

(3) Кроме того, я хотел бы выполнить поиск на основе bgColor. Как мне этого добиться?

Я пытался с запросом гео-формы , но не смог реализовать его с правильным результатом. Кроме того, в Geo-shape query есть ограничение, что значения должны l ie между 90 - 180. Я думаю, что часть, которую мы можем обработать, нормализуя значения.

Образец JSON:

{
    "responses": [{
        "textAnnotations": [{
                "description": "were",
                "boundingPoly": {
                    "vertices": [{
                            "x": 112,
                            "y": 5
                        },
                        {
                            "x": 333,
                            "y": 5
                        },
                        {
                            "x": 333,
                            "y": 93
                        },
                        {
                            "x": 112,
                            "y": 93
                        }
                    ],
                    "confidence": 99
                },
                "wordInfo": {
                    "length": 4,
                    "width": 221,
                    "height": 88,
                    "bgColor": [
                        255,
                        255,
                        251
                    ]
                }
            },
            {
                "description": "gonna",
                "boundingPoly": {
                    "vertices": [{
                            "x": 338,
                            "y": 5
                        },
                        {
                            "x": 589,
                            "y": 5
                        },
                        {
                            "x": 589,
                            "y": 93
                        },
                        {
                            "x": 338,
                            "y": 93
                        }
                    ],
                    "confidence": 99
                },
                "wordInfo": {
                    "length": 5,
                    "width": 251,
                    "height": 88,
                    "bgColor": [
                        255,
                        255,
                        255
                    ]
                }
            }
        ]
    }]
}

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

Поскольку вы используете ограничивающие прямоугольные координаты слов над изображением, я бы предложил вам использовать shape datatype, так как нет ограничения значений координат.

"vertices": {
            "type": "shape"
        }

Также сделайте Обязательно управляйте координатами ограничивающего прямоугольника в следующем формате.

[[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x1,y1]]

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

Публикация данных в документе, например:

POST /example/_doc
{
    "vertices" : {
    "type" : "polygon",
    "coordinates" : [
        [ [1000.0, -1001.0], [1001.0, -1001.0], [1001.0, -1000.0], [1000.0, -1000.0], [1000.0, -1001.0] ]
    ]
  }
}

Для поиска вы можете использовать запрос типа envelope , чтобы вам не пришлось записывать все координаты ограничительной рамки, вы можете установить конверт (прямоугольник) для поиска, и он даст вам все документы, которые содержатся в конверте. Примечание: ввод координат для поиска типа конверта в несколько ином формате занимает [[minX,maxY],[maxX,minY]] этот тип формата.

Пример:

{
  "query":{
      "bool": {
          "must": {
              "match_all": {}
          },
          "filter": {
              "shape": {
                  "prefix.vertices": {
                      "shape": {
                          "type": "envelope",
                          "coordinates": [
                                  [40,60],
                                  [100,40]
                              ]
                      }
                  }
              }
          }
      }
   }
}

Поскольку каждое поле вasticsearch может иметь одно или несколько значений ( в форме значений массива, поиск bgColor можно выполнить с помощью запроса с обязательным соответствием для сопоставления всех значений с элементами bgColor.

Пример:

{
  "query": {
      "bool": {
          "must": [
            {"match": {"prefix.wordInfo.bgColor": 1}},
            {"match": {"prefix.wordInfo.bgColor": 2}},
            {"match": {"prefix.wordInfo.bgColor": 3}}
          ]
      }
  }
}

Надеюсь, это поможет.

0 голосов
/ 05 апреля 2020

geo_shape предназначен для ... географических c фигур. Поэтому вам нужно либо

  • нормализовать ваши координаты, чтобы они вписывались в пределы широты / долготы spe c, и только затем синхронизировать c их как таковые
  • или вы можете рассматривать их как, скажем, проекцию Меркатора (EPSG: 900913), которая поддерживает такие значения, как [589, 93], а затем конвертировать их в фактические значения широты / долготы. Хотя вы должны иметь в виду, что, скажем, геопункт [0 (lon), 1 (lat)], преобразованный в координаты меркатора, равен [0, ~ 111325]. Поэтому вам также понадобится некоторый коэффициент масштабирования, чтобы не сделать ваш геополигон слишком маленьким. Другими словами, разница в 1 координате меркатора составляет 0,000009 ° в WGS 84, что означает, что ваши полигоны могут быть слишком маленькими для индексации и / или слишком высоким разрешением для эффективного хранения .

Пошаговое руководство:

  1. Преобразование и / или нормализация ваших координат
  2. Преобразование ваших [x, y] пар в [lon, lat] пары
  3. Преобразуйте цвета [r, g, b] в строки rgb ([0,0,0] => "# 000000") - если только вы не собираетесь выполнять запрос по фактическому каналы r, g, b
  4. Создание индекса с отображением гео-формы:
PUT /example
{
    "mappings": {
        "properties": {
            "location": {
                "type": "geo_shape"
            },
            "bgColor": {
                "type": "keyword"
            }
        }
    }
}
Убедитесь, что координаты вашего полигона начинаются и заканчиваются одним и тем же геопунктом, и оберните их еще в 2 пустых массива в соответствии со стандартом geo json. Syn c ваши полигоны + bgColor s
POST /example/_doc
{
    "location" : {
        "type" : "polygon",
        "coordinates" : [
            [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
        ]
    },
    "bgColor": "#000000"
}

После этого в других местах уже есть ответы на многие вопросы о том, как искать полигоны и как искать (цветные) строки.

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