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

Retrieving data with dynamic attributes in Cassandra

我正在为 Cassandra 开发一个解决方案,但事实证明这是不可能的。

我们有一个 table 将 return 给定一些搜索条件的一组候选人。得分最高的行 return 返回给用户。我们可以使用 SQL 轻松完成此操作,但需要迁移到 Cassandra。以下是涉及的 table:

价值

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

发送的查询可以填充或不填充这四个属性中的任何一个。我们搜索我们的值 table,计算分数,return 最高分。如果值 table 中的一列为空,则表示它适用于所有人。

示例:

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 的一些注意事项,因为我需要的所有资源都分散在互联网上。

  1. 您必须首先使用 Solr 启动 Cassandra。 dse 工具有一个命令,用于在启用 Solr 的情况下启动 cassandra。

    $CASSANDRA_HOME/bin/dse cassandra -s

  2. 您必须在启用网络拓扑状态和 solr 的情况下创建密钥空间。

    CREATE KEYSPACE ... WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'Solr': 1}

  3. 在启用 solr 的键空间中创建 table 后,使用 dsetool 创建一个核心。

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

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

  4. 要对值可能存在或不存在的列执行所需的查询,需要进行一些复杂的查询。

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

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

就是这样,希望我已经让人们摆脱了我遇到的所有令人头疼的问题。