Поиск доступных предметов для бронирования - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю над системой онлайн-бронирования товаров.

Я использую пн go для хранения информации о бронировании и деталях

Позиция

{
  id: "3",
  "name": "",
  "description": "",
  "extra": [{}]
}

Бронирование

{
  "id": "",
  "itemId":""
  "startDate": millis,
  "endDate": millis,
  "status": "",
  "userId": ""
}

Я должен осуществить поиск по ч / б датам. Поиск должен вернуть только доступные элементы за указанный период. Как я могу построить масштабируемый поиск для этого? Я планирую использовать elasti c также для поиска. Любые предложения, связанные с новыми технологиями, также приветствуются.

Ответы [ 2 ]

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

При индексации предметов в Elasticsearch вы можете проверить бронирование. Подумайте, что вы индексируете предметы, и вы получаете предмет из Пн go. Кроме того, вы можете получить заказы на этот предмет и добавить поле типа bookingCount внутри документа элемента Elasticsearch. При поиске вы можете использовать поле bookingCount для поиска без резервирования.

Как правило, индексирование выполняется асинхронно c операций. Вы можете использовать очередь. Таким образом, это уменьшит задержку для пользовательских операций. И вы можете делать то, что вы хотите там. Вы можете получить сводку по бронированию и поместить в элемент.

{
  id: "3",
  "name": "",
  "description": "",
  "extra": [{}],
  "bookingCount": "",
  "bookingsByStatus": {
    "status_1": 1233,
    "status_2": 1233,
    ...
  }
}

Но это бизнес-решение. И после любого обновления товаров и бронирования вам нужно обновить товар из индекса Elasticsearch. Кроме того, вы можете использовать другое решение, например, упоминание от @jzzfs.

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

Я бы предложил сделать booking базовый объект и поместить в него информацию об элементе. То есть:

Настройка сопоставления:

PUT bookings
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "item": {
        "properties": {
          "id": {
            "type": "keyword"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "description": {
            "type": "text"
          },
          "extra": {
            "type": "nested"
          }
        }
      },
      "startDate": {
        "type": "date",
        "format": "epoch_millis"
      },
      "endDate": {
        "type": "date",
        "format": "epoch_millis"
      },
      "status": {
        "type": "keyword"
      },
      "userId": {
        "type": "keyword"
      }
    }
  }
}

Ingest самое простое бронирование

POST bookings/_doc
{
  "item": {
    "id": "987"
  },
  "startDate": 1587110540025,
  "endDate": 1587220730025
}

Ограничение *Date полей и возвращает только соответствующий item:

GET bookings/_search
{
  "_source": "item",
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "startDate": {
              "gte": "17/04/2020",
              "format": "dd/MM/yyyy"
            }
          }
        },
        {
          "range": {
            "endDate": {
              "lte": "18/04/2020",
              "format": "dd/MM/yyyy"
            }
          }
        }
      ]
    }
  }
}

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

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