0

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

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

  • 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 中为这样的东西建模?

4

1 回答 1

0

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

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

    $CASSANDRA_HOME /bin/dse cassandra -s

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

    创建密钥空间 ... WITH 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 *:*) OR column:value }"';

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

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

于 2016-02-15T18:05:34.050 回答