Cassandra 2.1 在Cassandra中检索具有动态属性的数据

Cassandra 2.1 在Cassandra中检索具有动态属性的数据,cassandra-2.1,Cassandra 2.1,我正在为卡桑德拉研究一个不可能的解决方案 我们有一个表,它将返回给定搜索条件的一组候选项。得分最高的行将返回给用户。我们可以用SQL很容易地做到这一点,但需要迁移到Cassandra。以下是相关表格: 价值观 得分 ATTRIBUTE | SCORE -------------+------------- COUNTRY | 1 STATE | 2 CITY | 4 COUNTY | 8 发送的查询可以填充或不填充这四个属性中的

我正在为卡桑德拉研究一个不可能的解决方案

我们有一个表,它将返回给定搜索条件的一组候选项。得分最高的行将返回给用户。我们可以用SQL很容易地做到这一点,但需要迁移到Cassandra。以下是相关表格:

价值观

得分

ATTRIBUTE    | SCORE    
-------------+-------------
COUNTRY      | 1
STATE        | 2
CITY         | 4
COUNTY       | 8
发送的查询可以填充或不填充这四个属性中的任何一个。我们搜索价值表,计算分数,然后返回最高的分数。如果values表中的一列为null,则表示它适用于所有列

  • ID 1适用于美国境内的所有州、市和县
  • ID 2适用于德克萨斯州所在的所有国家、城市和县
例如:

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中对类似的内容进行建模?

发现实现这一点的最佳方法是将Solr与Cassandra结合使用。 关于使用Solr需要注意的一些事情,因为我需要的所有资源都分散在互联网上

  • 你必须先从索尔开始。dse工具中有一个命令,用于在启用Solr的情况下启动cassandra。 $CASSANDRA_HOME/bin/dse CASSANDRA-s

  • 必须在启用网络拓扑策略和solr的情况下创建密钥空间。 创建键空间。。。使用复制={'class':'NetworkTopologyStrategy','Solr':1}

  • 在启用solr的键空间中创建表后,使用dsetool创建一个核心

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

    这将允许solr为您的数据编制索引,并针对您的cassandra表生成许多二级索引

  • 要对值可能存在或不存在的列执行所需的查询,需要一个稍微复杂的查询。 从keyspace.table_name中选择*,其中solr_query='{“q”:“{(-column:[*TO*]和*:*)或column:value}”

  • 最后,您可能会注意到在搜索文本时,solr查询列“Hello”可能会拾取其他不需要的值,如HelloWorld或Helloothere。这是由于solr的schema.xml中使用的数据类型造成的。以下是如何修改此行为:
    • 前往Solr管理员用户界面(通常http://hostname:8983/solr/)
    • 在左窗格的下拉列表中选择核心,应命名为keyspace.table_name
    • 查找Config或Schema,两者都应指向Schema.xml
    • 将该文件复制并粘贴到某个文本编辑器。或者,您可以尝试使用wget或curl下载该文件,但您需要右上角文本字段框中提供的真实链接
    • 有一个名为TextField的标记
      。将
      org.apache.solr.schema.TextField
      替换为
      org.apache.solr.schema.StrField
      。您还必须删除分析器,StrField不支持这些分析器
  • 就这样,我希望我已经把人们从我遇到的所有头痛中解救出来了

    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)