我在下面有一个日志表,
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';
有没有办法搜索两个索引字段,请帮助我。
谢谢,
哈利
答案 0 :(得分:1)
喜欢和扫描二级索引不是cassandra的优点。
您可能希望将cassandra作为您的存储引擎运行,并在其前面进行solr或弹性搜索。
因此,在发出警告的情况下,您可以执行以下操作:
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子句而是必须硬编码。如果您只想扫描所有模块中的消息,您将会回到之前的日志表中。
或者,您可以在应用程序层进行过滤。