Использование уникального идентификатора в индексированном имени поля Solr

У меня есть следующая структура в моих документах:

документ: 1

{
  "123e4567-e89b-12d3-a456-426655440000": {
    "order_id": "100",
    "qty": 27
  },
  "321e7654-e89b-21d3-a654-426655441111": {
    "order_id": "234",
    "qty": 12
  }
}

документ: 2

{
  "123e4567-e89b-12d3-a456-426655440000": {
    "order_id": "101",
    "qty": 27
  },
  "789ab763-a56b-87bb-a654-873655442222": {
    "order_id": "345",
    "qty": 23
  }
}

куда uuid в корне документа представляет идентификатор клиента, а вложенный объект представляет заказ, сделанный клиентом.

Единственный интересующий меня запрос - это простой запрос по одному полю на идентификатор клиента и идентификатор заказа, чтобы найти их заказы:

customer_idx?q=*:*&fq=123e4567-e89b-12d3-a456-426655440000.order_id:*&sort=123e4567-e89b-12d3-a456-426655440000.order_id asc&rows=3

или конкретный:

customer_idx?q=*:*&fq=123e4567-e89b-12d3-a456-426655440000.order_id:101&rows=1

Вопрос Было бы хорошо, чтобы определить dynamicField по идентификатору клиента? С точки зрения производительности. В этом случае я получу сотни тысяч или миллионы полей для конкретной схемы.

<dynamicField name="*.order_id" type="string" indexed="true" stored="false" multiValued="false" />

Я понимаю, что большое количество проиндексированных полей будет влиять на производительность и потребление памяти, если я буду использовать многие из них в одном запросе, поскольку Lucene создает массив из одного элемента на документ для каждого поля, которое я запрашиваю или сортирую. Но будет ли проблемой то, что, имея сотни тысяч или миллионы полей, я просто сделаю запрос по одному из них одновременно?

Если нет, что было бы лучшим решением?

Благодарю.

ОБНОВЛЕНИЕ: обновлены примеры запросов. Добавлен фильтр, сортировка и ограничение. В случае, если это имеет значение.

1 ответ

Основная проблема с такими запросами возникает, когда вы начинаете сортировать набор результатов. FieldCache (которого вы можете избежать, если вы сейчас используете docValues), будет заполняться int (docid) для каждого документа в индексе относительно его позиции, и даже если поле содержит только небольшое количество документов будет создан весь массив. Вместо этого был доступен патч для создания разреженного списка, в котором перечислены только те документы, которые содержат поле.

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

customer_id:123e4567-e89b-12d3-a456-426655440000
customer_id_order_id:123e4567-e89b-12d3-a456-426655440000_101

.. так что вы получите один кэш для каждого поля, независимо от того, сколько полей у вас есть.

Вы также можете разбить ваши документы на два отдельных документа, по одному для каждой комбинации customer / order_id, и, таким образом, запросить их как обычные документы (вместо двух значений внутри каждого документа).

Другие вопросы по тегам