代码之家  ›  专栏  ›  技术社区  ›  Harry

Cassandra中双索引字段的搜索

  •  1
  • Harry  · 技术社区  · 6 年前

    我在下面有一个日志表,

    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';
    

    有没有办法在两个索引字段上搜索,请在这方面帮助我。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Highstead    6 年前

    Like和扫描二级索引不是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子句中,而必须进行硬编码。如果您只想扫描所有模块中的消息,那么您可以使用以前的日志表。

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