2016-02-07 3 views
0

Я работаю над решением для Cassandra, которое оказалось невозможным.Извлечение данных с динамическими атрибутами в Cassandra

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

Значение

ID  | VALUE | COUNTRY | STATE | CITY  | COUNTY 
--------+---------+----------+----------+-----------+----------- 
1  | 50  | US  |   |   | 
--------+---------+----------+----------+-----------+----------- 
2  | 25  |   | TX  |   | 
--------+---------+----------+----------+-----------+----------- 
3  | 15  |   |   | MEMPHIS | 
--------+---------+----------+----------+-----------+----------- 
4  | 5  |   |   |   | BROWARD 
--------+---------+----------+----------+-----------+----------- 
5  | 30  |   | NY  | NYC  | 
--------+---------+----------+----------+-----------+----------- 
6  | 20  | US  |   | NASHVILLE | 
--------+---------+----------+----------+-----------+----------- 

Забив

ATTRIBUTE | SCORE  
-------------+------------- 
COUNTRY  | 1 
STATE  | 2 
CITY   | 4 
COUNTY  | 8 

Запрос посылается, который может иметь любой из этих четырех признаков заселенных или нет. Мы просматриваем таблицу наших значений, вычисляем оценки и возвращаем самый высокий. Если столбец в таблице значений имеет значение null, это означает, что он применим для всех.

  • ID 1 применим ко всем штатам, городам и уездам США.
  • ID 2 применим для всех стран, городов и округов, где находится состояние TX.

Пример:

Query:    {Country: US, State: TX} 
Matches Value IDs: [1, 2, 3, 4, 6] 
Scores:   [1, 2, 4, 8, 5(1+4)] 
Result:   {id: 4} (8 was the highest score so Broward returns) 

Как бы вы модель что-то подобное в Cassandra 2.1?

ответ

0

Нашел лучший способ достичь этого, используя Solr с Cassandra. Признаки, которые следует учитывать при использовании Solr, поскольку все необходимые мне ресурсы были разбросаны среди Интернета.

  1. Вы должны сначала запустить Кассандру с Solr. Есть команда с инструментом dse для запуска cassandra с включенным Solr.

    $ CASSANDRA_HOME/бен/DSE Cassandra -s

  2. Вы должны создать пространство ключей с сетевой топологии и Solr СТРАТЕГИЯ включена.

    СОЗДАТЬ ... С ключевого пространства REPLICATION = { 'класс': 'NetworkTopologyStrategy', 'Solr': 1}

  3. После создания таблицы в пределах вашего SOLR включен ключевого пространства, создать ядро ​​с помощью dsetool.

    $ CASSANDRA_HOME/бен/dsetool create_core keyspace.table_name generateResources = истина переиндексации = истина

    Это позволит Solr индексировать ваши данные и генерировать ряд вторичных индексов против вашего Кассандры Таблица.

  4. Для выполнения запросов, необходимых для столбцов, где значения могут существовать или не существовать, требует несколько сложного запроса.

    SELECT * FROM keyspace.table_name ГДЕ solr_query = '{ "д": "{(- колонка: [* К *] И *: *) ИЛИ колонка: значение}"';

  5. Наконец, вы можете заметить, что при поиске текста ваш столбец запроса solr: «Привет» может забрать другие нежелательные значения, такие как HelloWorld или HelloThere. Это связано с типом данных, используемым в вашем schema.xml для Solr. Вот как изменить это поведение:
    • Голова к пользовательскому интерфейсу Solr Admin. (Как правило, HTTP: // имя хоста: 8983/Solr /)
    • Выберите ядро ​​в раскрывающемся списке в левой панели, должен быть назван keyspace.table_name.
    • Ищите конфигурацию или схему, оба должны перейти к schema.xml.
    • Скопируйте и вставьте этот файл в какой-либо текстовый редактор. При желании вы можете попробовать использовать wget или curl для загрузки файла, но вам нужна реальная ссылка, которая предоставляется в поле текстового поля в верхнем правом углу.
    • Есть тег <fieldtype>, с именем TextField. Заменить org.apache.solr.schema.TextField на org.apache.solr.schema.StrField. Вы также должны удалить анализаторы, StrField не поддерживает их.

Это, надеюсь, я спас людей от всех головных болей, с которыми я столкнулся.