在 Cassandra 中搜索两个索引字段

Search on two indexed field in Cassandra

我在下面有一个日志table,

CREATE TABLE log (    
"date" text,     
"timestamp" timestamp, 
"eventId" text, 
"message" text,
"module" text,
"userId" text,
"ovirtEventId" text, 
"category" text, 
primary key ("date","timestamp","eventId")) with clustering order by ("timestamp" DESC);

它根据日期进行分区,因此可以完美缩放,

我对以下字段进行了索引,

CREATE CUSTOM INDEX module_idx ON log ("module") USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};

CREATE CUSTOM INDEX user_idx ON log ("userId")  USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};

CREATE CUSTOM INDEX message_idx ON log ("message")  USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};

CREATE CUSTOM INDEX event_category_idx ON log ("category")  USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};

以下查询有效,

SELECT * FROM log WHERE date = '20180223' AND "message" LIKE '%This%';

但是当我尝试查询两个索引字段时,它失败了,

SELECT * FROM log WHERE date = '20180223' AND "message" LIKE '%This%' AND module LIKE 'test';

有没有办法在两个索引字段上进行搜索,请帮助我。

赞和扫描二级索引不是cassandra的强项。

您可能希望 运行 cassandra 作为您的存储引擎,并在其前面安装 solr 或 elastic search。

所以在警告消失的情况下,您可以这样做:

CREATE TABLE log_idx (
"date" text, 
"timestamp" timestamp, 
"eventId" text, 
"message" text,
"module" text,
"userId" text,
"ovirtEventId" text, 
"category" text, 
primary key (module, date), timestamp, eventId) with clustering order by ("timestamp" DESC);


CREATE CUSTOM INDEX message_log_idx ON log ("message")  USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};

SELECT * FROM log_idx WHERE module='x' AND date='y' AND message LIKE '%z';

这不是您想要的,因为我们已经确定您的模块不能再位于 LIKE 子句中,而必须进行硬编码。如果您只想扫描所有模块中的消息,您会回到以前的日志 table。

或者您可以在应用层进行过滤。