在Cassandra中使用动态属性检索数据

时间:2016-02-07 04:15:52

标签: cassandra-2.1

我正在为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

发送的查询可以填充或不填充这四个属性中的任何一个。我们搜索我们的值表,计算得分,然后返回最高得分。如果values表中的列为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中模拟这样的东西?

1 个答案:

答案 0 :(得分:0)

发现实现这一目标的最佳方法是使用Solr和Cassandra。 关于使用Solr的事情需要注意,因为我需要的所有资源都分散在互联网中。

  1. 你必须先用Solr开始Cassandra。在启用了Solr的情况下启动cassandra的dse工具有一个命令。
      

    $ CASSANDRA_HOME / bin / dse cassandra -s

  2. 您必须使用网络拓扑状态和启用solr来创建密钥空间。
      

    创建KEYSPACE ...与REPLICATION = {' class':' NetworkTopologyStrategy',' Solr':1}

  3. 在启用solr的密钥空间中创建表后,使用dsetool创建核心。

      

    $ CASSANDRA_HOME / bin / dsetool create_core keyspace.table_name generateResources = true reindex = true

    这将允许solr索引您的数据并为您的cassandra表生成许多二级索引。

  4. 要执行值可能存在或不存在的列所需的查询,需要稍微复杂的查询。
      

    SELECT * FROM keyspace.table_name WHERE solr_query =' {" q":" {( - column :[ * TO *] AND *:*)或栏:值}"';

  5. 最后,您可能会注意到在搜索文本时,您的solr查询列:" Hello"可能会选择其他不需要的值,如HelloWorld或HelloThere。这是因为您的schema.xml中使用的Solr数据类型。以下是修改此行为的方法:
    • 前往您的Solr管理员界面。 (通常为http:// 主机名:8983 / solr /)
    • 在左侧窗格的下拉列表中选择您的核心,应命名为 keyspace.table_name
    • 查找Config或Schema,两者都应该带您到schema.xml。
    • 将该文件复制并粘贴到某个文本编辑器中。或者,您可以尝试使用wget或curl下载文件,但是您需要在右上角的文本字段框中提供的真实链接。
    • 标签为<fieldtype>,名称为TextField。将org.apache.solr.schema.TextField替换为org.apache.solr.schema.StrField。您还必须删除分析器,StrField不支持这些。
  6. 这就是它,希望我能让人们免于遇到的所有头痛。