Часто приходится искать компромисс между издержками на получение результатов и издержками на сортировку результатов. Поэтому CQEngine поддерживает различные стратегии минимизации издержек, описанные ниже.
По умолчанию CQEngine использует стратегию упорядочивания, известную как materialize, чтобы упорядочивать результаты. По сути, это позволяет CQEngine использовать наиболее подходящие индексы для поиска объектов, соответствующих запросу, а затем явно сортировать результаты.
Стратегия упорядочивания index позволяет CQEngine использовать индекс по атрибуту, по которому должны быть упорядочены результаты, для управления поиском. Никакие другие индексы не будут использоваться для поиска, но результаты не нужно будет сортировать впоследствии.
Эту стратегию можно включить, настроив EngineThresholds.INDEX_ORDERING_SELECTIVITY, как описано в разделе «Лучшие практики» ниже.
Обратите внимание, что набор индексов, необходимых для поддержки стратегии упорядочивания index для любого конкретного атрибута, зависит от типа атрибута:
SimpleAttribute
(тип атрибута, который возвращает ровно одно значение для каждого объекта в коллекции):
SimpleAttribute
гарантирует, что каждый объект в коллекции будет иметь ровно одно значение этого типа атрибута.SimpleNullableAttribute
, MultiValueAttribute
или MultiValueNullableAttribute
:
Car.FEATURES
, но не у каждой машины в коллекции есть специальные функции, то эти объекты в коллекции будут отсутствовать в индексе для Car.FEATURES
.Вот пример того, как включить стратегию упорядочивания index для MultiValueAttribute
(полный исходный код здесь):
public static void main(String[] args) {
IndexedCollection<Car> cars = new ConcurrentIndexedCollection<Car>();
cars.addIndex(NavigableIndex.onAttribute(Car.FEATURES));
cars.addIndex(NavigableIndex.onAttribute(forObjectsMissing(Car.FEATURES)));
cars.addAll(CarFactory.createCollectionOfCars(100));
ResultSet<Car> results = cars.retrieve(
between(Car.CAR_ID, 40, 50),
queryOptions(
orderBy(ascending(missingLast(Car.FEATURES))),
applyThresholds(threshold(INDEX_ORDERING_SELECTIVITY, 1.0))
)
);
for (Car car : results) {
System.out.println(car); // печатает автомобили с 40 по 50, используя индекс Car.FEATURES для ускорения упорядочивания
}
}
Стратегия упорядочивания index заставляет CQEngine использовать индекс для атрибута, по которому результаты должны быть упорядочены (если доступно), для управления своим поиском.
Стратегия упорядочивания materialize позволяет CQEngine использовать другие индексы для поиска объектов, соответствующих запросу, а затем сортировать эти результаты впоследствии.
Приложение может включить стратегию упорядочивания индекса, установив пороговое значение с помощью параметров запроса: applyThresholds(threshold(INDEX_ORDERING_SELECTIVITY, 1.0))
.
Пороги избирательности:
Что такое избирательность?
Если указан порог между 0,0 и 1,0, то CQEngine автоматически вычислит избирательность запроса. Затем он автоматически будет использовать стратегию index, если избирательность ниже заданного порога, и стратегию materialize, если избирательность выше заданного порога.
Однако следует отметить, что существует компромисс в вычислениях:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )