如何在Cassandra 2.1.5中查询索引上的CONTAINS?

3

有一本书格,该表格具有以下定义。 书名将保存在列名中 - 属性将是一个映射,其中将保存诸如作者姓名、出版年份等属性。

CREATE TABLE book (
    bookid uuid PRIMARY KEY,
    createdat timestamp,
    createdon timestamp,
    description text,
    attributes map<text, text>,
    name text
) CREATE INDEX bookbyname ON project (name);

问题 - 应该开发一个查询,可以从 UI 上的通用搜索运行,并提供一个字符串。该字符串应在属性列和名称上查询 [包含]。
对于属性,由于它是 MAP,所以支持 CONTAINS 关键字。然而,如何在索引上执行包含查询?在这种情况下,是通过 bookbyname(名称)字段进行查询的。

为什么不使用简单的等于运算符来匹配名称?例如 where name = '...' - Stefan Podkowinski
是的,这就是我目前正在做的。但是如果我需要支持通配符搜索,比如“Project a”.. 我需要检索包含“Project a”的所有项目.. 所以我需要使用CONTAINS函数。 - Karthik Shivkumar
我还想指出的是,你的 name 列似乎与 bookid 具有相同的基数。在高基数列上建立二级索引不会有很好的性能表现。如果你确实需要按书名查询,你应该考虑构建一个 bookbyname 查询表。这并不能解决你目前的主要问题,但它可以避免以后一些性能方面的麻烦。 - Aaron
1个回答

2

Cassandra不支持使用CONTAINS或LIKE运算符匹配部分字符串。您应该研究像StargateDSE这样的解决方案,它们在Cassandra之上提供搜索功能。


谢谢Stefan。我会看一下Stargate并检查它是否提供CONTAINS或LIKE运算符的选项。 - Karthik Shivkumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接