在 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 中的一列为空,则表示它适用于所有人。
- 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 的一些注意事项,因为我需要的所有资源都分散在互联网上。
- 您必须首先使用 Solr 启动 Cassandra。 dse 工具有一个命令,用于在启用 Solr 的情况下启动 cassandra。
$CASSANDRA_HOME/bin/dse cassandra -s
- 您必须在启用网络拓扑状态和 solr 的情况下创建密钥空间。
CREATE KEYSPACE ... WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'Solr': 1}
在启用 solr 的键空间中创建 table 后,使用 dsetool 创建一个核心。
$CASSANDRA_HOME/bin/dsetool create_core keyspace.table_name generateResources=true reindex=true
这将允许 solr 为您的数据编制索引并针对您的 cassandra 生成许多二级索引 table。
- 要对值可能存在或不存在的列执行所需的查询,需要进行一些复杂的查询。
SELECT * FROM keyspace.table_name WHERE solr_query = '{"q": "{(-column:[* TO *] AND *:*) OR column:value}"';
- 最后,您可能会注意到在搜索文本时,您的 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 不支持这些分析器。
就是这样,希望我已经让人们摆脱了我遇到的所有令人头疼的问题。
我正在为 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 中的一列为空,则表示它适用于所有人。
- 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 的一些注意事项,因为我需要的所有资源都分散在互联网上。
- 您必须首先使用 Solr 启动 Cassandra。 dse 工具有一个命令,用于在启用 Solr 的情况下启动 cassandra。
$CASSANDRA_HOME/bin/dse cassandra -s
- 您必须在启用网络拓扑状态和 solr 的情况下创建密钥空间。
CREATE KEYSPACE ... WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'Solr': 1}
在启用 solr 的键空间中创建 table 后,使用 dsetool 创建一个核心。
$CASSANDRA_HOME/bin/dsetool create_core keyspace.table_name generateResources=true reindex=true
这将允许 solr 为您的数据编制索引并针对您的 cassandra 生成许多二级索引 table。
- 要对值可能存在或不存在的列执行所需的查询,需要进行一些复杂的查询。
SELECT * FROM keyspace.table_name WHERE solr_query = '{"q": "{(-column:[* TO *] AND *:*) OR column:value}"';
- 最后,您可能会注意到在搜索文本时,您的 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 不支持这些分析器。
就是这样,希望我已经让人们摆脱了我遇到的所有令人头疼的问题。