spring-data-cassandra: InvalidQueryException: невозможно выполнить этот запрос, используйте РАЗРЕШИТЬ ФИЛЬТРИРОВАНИЕ

У меня есть следующий код

  @Indexed
  @PrimaryKeyColumn(name = "x", ordinal = 1, type = PrimaryKeyType.PARTITIONED)
  @Column(value="x")
  private String x;

  @Indexed
  @PrimaryKeyColumn(name = "code", ordinal = 2, type = PrimaryKeyType.PARTITIONED)
  @Column(value="code")
  private String code;

@Query(value = "select * from customers where code = ?0")
Optional<Customer> findByCode(String code);

Когда это выполняется, я получаю Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING.

Есть ли способ избежать этого только из spring-data-cassandra? Я не хочу добавлять ALLOW FILTERING в свой запрос. Я попытался создать отдельный индекс для столбца code, но это не решило проблему. Я думаю, что это останавливается в конфигурации данных Spring. Если я выполняю тот же запрос в cqlsh, он работает.


person tzortzik    schedule 04.10.2017    source источник


Ответы (2)


Вы должны указать ключ раздела в своем запросе, если вы не создаете индекс или не используете РАЗРЕШИТЬ ФИЛЬТРАЦИЯ

Выполнение запроса с разрешающей фильтрацией может быть не очень хорошей идеей, поскольку оно может использовать много ваших вычислительных ресурсов и может не вернуть никакого результата из-за тайм-аута. Не используйте разрешающую фильтрацию в рабочей среде Прочтите документацию datastax об использовании разрешающей фильтрации.

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/select_r.html?hl=allow,filter

person Ashraful Islam    schedule 04.10.2017
comment
что это означает на практике указать ключ раздела в вашем запросе? как это сделать в коде? - person davey; 04.05.2018
comment
Для простого первичного ключа первое поле — это ключ раздела. Подробнее здесь stackoverflow.com/a/24953331/2320144 - person Ashraful Islam; 06.05.2018

При использовании базы данных без SQL необходимо правильно спроектировать данные, чтобы избежать фильтрации. Вы можете добавить вторичный индекс для оптимизации поиска по определенному полю. Подробнее здесь: https://docs.datastax.com/en/archived/cql/3.3/cql/cql_using/useSecondaryIndex.html

Если вы уверены, что запрос именно то, что вам нужно, вы можете использовать параметр allowFiltering в аннотации @Query, чтобы явно указать, что будет использоваться ALLOW FILTERING.

@Query(value = "select * from customers where code = ?0", allowFiltering = true)
Optional<Customer> findOneByCode(String code);
person Omtara    schedule 05.02.2020