cassandra-lucene-index, 基于Lucene的Cassandra辅助索引

分享于 

12分钟阅读

GitHub

  繁體 雙語
Lucene based secondary indexes for Cassandra
  • 源代码名称:cassandra-lucene-index
  • 源代码网址:http://www.github.com/Stratio/cassandra-lucene-index
  • cassandra-lucene-index源代码文档
  • cassandra-lucene-index源代码下载
  • Git URL:
    git://www.github.com/Stratio/cassandra-lucene-index.git
    Git Clone代码到本地:
    git clone http://www.github.com/Stratio/cassandra-lucene-index
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Stratio/cassandra-lucene-index
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    stratio索引的Cassandra

    美国大陆标准/索引/索引/索引,包括全文搜索功能和免费搜索功能,包括全文搜索功能和免费的搜索功能。 它通过基于的实现实现,其中每个集群都索引自己的数据。 stratio索引是基于平台的核心模块之一。

    architecture

    索引相关搜索允许你检索 n 更相关的结果满足搜索。 coordinator node 将搜索发送到集群中的每个 node,每个 node 返回它的n n 最佳结果,然后协调器将这些部分结果合并到 coordinator,避免完全扫描。 你还可以将排序基于字段的组合。

    表中的任何单元格都可以被索引,包括主键中的单元以及集合。 还支持宽行。 你可以扫描标记/键范围,在过滤后的结果中应用附加的CQL3子句和页面。

    当你使用 MapReduce 框架来分析存储在Cassandra中的数据时,索引过滤搜索是一个强大的帮助,如 Apache Spark。 在作业输入中添加Lucene过滤器可以显著减少要处理的数据量,避免完全扫描。

    spark_architecture

    以下基准测试结果可以让你在将Lucene索引与Spark结合起来时,了解预期的性能。 我们对存储数据的1%到 100%进行连续查询。 我们可以看到查询请求强过滤数据的索引的高性能。 但是,性能下降在限制性较低的查询中。 随着查询返回的记录数量的增加,我们达到了一个比完全扫描更慢的点。 因此,在Spark作业中使用索引的决定取决于查询的选择性。 两种方法之间的权衡取决于具体的用例。 通常,对于检索不超过 25%个存储数据的作业,建议将Lucene索引与Spark结合使用。

    spark_performance

    本项目不打算取代Apache标准表。倒排索引和/或者二级索引。 它只是一个工具,用于执行一些实际上难以使用,的查询。

    oltp_olap

    更详细的信息可以在的stratio索引文档文件中使用。

    特性

    Lucene搜索技术集成到Cassandra中提供:

    stratio Lucene索引的Cassandra及其与Lucene搜索技术的集成提供了:

    • 全文搜索( 语言识别,通配符,模糊,regexp )
    • 布尔搜索( 以及,或者,不)
    • 按相关性。列值和距离排序
    • 地理空间索引( 点。线。多边形及其 multiparts )
    • 地理空间变换( 边界框。缓冲区。质心。凸壳。并集。差异。交集)
    • 地理空间操作( 交叉,包含,在内部)
    • 双时间搜索( 有效和事务持续时间)
    • CQL复杂类型( 列表。集合。映射。元组和 UDT )
    • CQL用户定义函数( UDF )
    • CQL分页,即使是经过排序的搜索
    • 带TTL的列
    • 基于第三方cql的驱动程序兼容性
    • Spark和Hadoop兼容性

    尚不支持:

    • Thrift API
    • 旧版 compact 存储选项
    • 索引 counter
    • 索引 static 列
    • 其他partitioners比 Murmur3

    要求

    • Cassandra ( 由插件版本的3 个数字标识)
    • Java> = 1.8 ( OpenJDK和Sun已经被测试)
    • Maven> = 3.0

    插件构建和安装

    stratio Lucene索引的Cassandra是作为一个Apache插件发布的。 因此,你只需要构建一个包含插件的jar,并将它的添加到cassandra的类路径中:

    • 克隆项目: git clone http://github.com/Stratio/cassandra-lucene-index
    • 更改到下载的目录: cd cassandra-lucene-index
    • 签出适合你的Apache版本的插件版本: git checkout A.B.C.X
    • 使用 Maven 构建插件: mvn clean package
    • 将生成的jar 复制到你兼容的Cassandra安装的lib文件夹中: cp plugin/target/cassandra-lucene-index-plugin-*.jar <CASSANDRA_HOME>/lib/
    • 像往常一样启动/重新启动 Cassandra。

    特定的Cassandra Lucene索引版本针对特定的Apache版本。 cassandra-lucene-index A.B. C.X 旨在与 Apache A.B. C。比如 cassandra-lucene-index一起使用: 3.0.7.1 cassandra: cassandra: 3。0.7. 请注意,生产就绪版本是版本标签( 比如。 3.0.6.3 ),在生产中不使用分支x 或者分支分支。

    另外,也可以使用这里 Maven 配置文件进行修补,指定Cassandra安装的路径,这里任务还删除了目录中的插件版本的以前的版本:

    mvn clean package -Ppatch -Dcassandra_home=<CASSANDRA_HOME>

    如果你没有安装版本的Cassandra,还可以使用其他配置文件让 Maven 下载并修补正确版本的Apache:

    mvn clean package -Pdownload_and_patch -Dcassandra_home=<CASSANDRA_HOME>

    现在你可以运行Cassandra并使用Cassandra查询语言进行一些测试:

    <CASSANDRA_HOME>/bin/cassandra -f<CASSANDRA_HOME>/bin/cqlsh

    lucene文件的索引将存储在与cassandra的遗嘱相同的目录中。 默认数据目录是 /var/lib/cassandra/data,每个索引位于它的索引列族的SSTables旁边。

    如果你使用地理形状搜索,则需要使用 JTS。

    有关Apache的更多细节,请参阅它的文档文档。

    示例

    我们将创建以下表格来存储 tweet:

    CREATE KEYSPACE demo
    WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};
    USE demo;CREATETABLEtweets (
     id INTPRIMARY KEY,
     user TEXT,
     body TEXT,
     timeTIMESTAMP,
     latitude FLOAT,
     longitude FLOAT
    );

    现在,你可以使用以下语句在它的上创建自定义的Lucene索引:

    CREATE CUSTOM INDEX tweets_index ON tweets ()
    USING 'com.stratio.cassandra.lucene.Index'WITH OPTIONS = {
     'refresh_seconds': '1',
     'schema': '{ fields: { id: {type:"integer"}, user: {type:"string"}, body: {type:"text", analyzer:"english"}, time: {type:"date", pattern:"yyyy/MM/dd"}, place: {type:"geo_point", latitude:"latitude", longitude:"longitude"} } }'};

    这将用指定类型索引表中的所有列,并且每秒刷新一次。 或者,你可以使用一致性 ALL的空白搜索显式刷新所有索引碎片:

    CONSISTENCY ALLSELECT*FROM tweets WHERE expr(tweets_index, '{refresh:true}');
    CONSISTENCY QUORUM

    现在,在某个日期范围内搜索 tweet:

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}}');

    可以强制对涉及的索引碎片进行显式刷新,从而执行相同的搜索:

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}, refresh: true}') limit100;

    在上面的日期范围内搜索正文包含短语"大数据给组织"的前 100个相关 tweet:

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}, query: {type:"phrase", field:"body", value:"big data gives organizations", slop: 1}}') LIMIT100;

    要优化搜索以只获取由名称以"a"开头的用户所写的tweet:

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: [ {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}, {type:"prefix", field:"user", value:"a"} ], query: {type:"phrase", field:"body", value:"big data gives organizations", slop: 1}}') LIMIT100;

    要获得 100个最近过滤的结果,你可以使用排序选项:

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: [ {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}, {type:"prefix", field:"user", value:"a"} ], query: {type:"phrase", field:"body", value:"big data gives organizations", slop: 1}, sort: {field:"time", reverse: true}}') limit100;

    前面的搜索可以限制为创建接近地理位置的tweet:

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: [ {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}, {type:"prefix", field:"user", value:"a"}, {type:"geo_distance", field:"place", latitude: 40.3930, longitude: -3.7328, max_distance:"1km"} ], query: {type:"phrase", field:"body", value:"big data gives organizations", slop: 1}, sort: {field:"time", reverse: true}}') limit100;

    还可以按地理位置的距离对结果进行排序:

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: [ {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}, {type:"prefix", field:"user", value:"a"}, {type:"geo_distance", field:"place", latitude: 40.3930, longitude: -3.7328, max_distance:"1km"} ], query: {type:"phrase", field:"body", value:"big data gives organizations", slop: 1}, sort: [ {field:"time", reverse: true}, {field:"place", type:"geo_distance", latitude: 40.3930, longitude: -3.7328} ]}') limit100;

    最后,你可以将任何搜索路由到某个标记范围或者分区,以便只能命中群集节点的子集。

    SELECT*FROM tweets WHERE expr(tweets_index, '{ filter: [ {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}, {type:"prefix", field:"user", value:"a"}, {type:"geo_distance", field:"place", latitude: 40.3930, longitude: -3.7328, max_distance:"1km"} ], query: {type:"phrase", field:"body", value:"big data gives organizations", slop: 1}, sort: [ {field:"time", reverse: true}, {field:"place", type:"geo_distance", latitude: 40.3930, longitude: -3.7328} ]}') AND TOKEN(id) >= TOKEN(0) AND TOKEN(id) < TOKEN(10000000) limit100;

    这最后是 Hadoop。Spark和其他MapReduce框架支持的基础。

    请参考 comprehensive 索引文档的全面 Cassandra。


    BASE  CAS  index  Cassandra  indexes  Lucene  
    相关文章