2015-05-04 3 views
5

В моей таблице cassandra у меня есть коллекция Map, также я проиндексировал ключи карты.Как найти карту коллекции cassandra с помощью QueryBuilder

CREATE TABLE IF NOT EXISTS test.collection_test(
    name text, 
    year text, 
    attributeMap map<text,text>, 
    PRIMARY KEY ((name, year)) 
); 




CREATE INDEX ON collection_test (attributeMap); 

Синтаксис QueryBuilder, как показано ниже:

select().all().from("test", "collection_test") 
       .where(eq("name", name)).and(eq("year", year)); 

Как я должен поместить где состояние на attributeMap?

ответ

2

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

CREATE INDEX attributeKeyIndex ON collection_test (KEYS(attributeMap)); 

Далее в SELECT из карты с индексированными ключами, вы будете нуждаться в CONTAINS KEY ключевом слове. Но в настоящее время в API-конструкторе запросов нет определения для этой функции. Тем не менее, есть открытый билет, чтобы поддержать его: JAVA-677

В настоящее время, чтобы сделать это с помощью драйвера Java, вам нужно создать свой собственный запрос или использовать подготовленное заявление:

PreparedStatement statement = _session.prepare("SELECT * " + 
      "FROM test.collection_test " + 
      "WHERE attributeMap CONTAINS KEY ?"); 
    BoundStatement boundStatement = statement.bind(yourKeyValue); 
    ResultSet results = _session.execute(boundStatement); 

Наконец, вы должны прочитать документ DataStax по адресу When To Use An Index. Известно, что вторичные индексы плохо работают. Я не могу себе представить, что вторичный индекс в коллекции будет другим.

 Смежные вопросы

  • Нет связанных вопросов^_^