Использование уникального идентификатора в индексированном имени поля 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, и, таким образом, запросить их как обычные документы (вместо двух значений внутри каждого документа).