如何在cassandra中为单词搜索建模

时间:2017-05-22 17:42:30

标签: cassandra

我的模型设计从复选框保存单词搜索,它必须有更新单词搜索和状态,删除(假)。我的旧模型设置pk是uuid(单词搜索的id),设置索引是状态(启用,禁用,删除)

但我不想在状态列设置索引(我认为在更新列设置索引非常糟糕)而且我不更改数据库

是否有更好的方法来模拟这个?

抱歉我的英语语法

1 个答案:

答案 0 :(得分:0)

您不应在非常低的基数列状态

上创建索引
  

避免非常低的基数指数,例如index其中不同值的数量非常低。一个很好的例子是关于用户性别的索引。在每个节点上,整个用户群将仅分布在索引的2个不同分区上:MALE&女。如果每个节点的用户数量非常密集(例如数百万),我们将为MALE& FEMALE索引,这是不好的

来源:https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive

处理此类案件的最佳方式:

  • 为每种状态创建单独的表
  • 或具有已知参数(年,月等)作为分区键的状态

第二选项的示例

CREATE TABLE save_search (
    year int,
    status int,
    uuid uuid,
    category text,
    word_search text,
    PRIMARY KEY((year, status), uuid)
);

在这里,您可以看到我使用yearstatus制作了复合分区键,因为基数较低的问题。如果您认为大量数据将处于单一状态,那么您还应将月份添加为复合分区键的一部分

如果您的数据集很小,您只需删除年份字段即可。

CREATE TABLE save_search (
    status int,
    uuid uuid,
    category text,
    word_search text,
    PRIMARY KEY(status, uuid)
);

如果您使用的是cassandra 3.x或更高版本,则可以使用materialized view

CREATE MATERIALIZED VIEW search_by_status AS
    SELECT *
    FROM your_main_table
    WHERE uuid IS NOT NULL AND status IS NOT NULL
    PRIMARY KEY (status, uuid);

您可以使用以下状态查询:

SELECT * FROM search_by_status WHERE status = 0;

您在主表cassandra上进行的所有删除,更新和插入都会将其与物化视图同步