什么是Cassandra Lucene指数的好选择?

时间:2016-01-22 04:58:51

标签: lucene cassandra

由于我经常遇到下面描述的这个问题,我想改变但缺乏更好的替代方案。

我有2个查询应返回相同的结果。但是第二个查询返回的结果要少得多,有时候没有结果。这些是2个查询:

SELECT * FROM statistics WHERE source = 'toutiao' AND timespan = '3';
SELECT * FROM statistics WHERE source = 'toutiao' AND timespan = '3' AND text = '{ sort: {fields: [{field: "speed", reverse: true}]}}';.

我使用此自定义cassandra索引https://github.com/Stratio/cassandra-lucene-index

编辑:

我使用Cassandra 2.2.4.1 cassandra-lucene-index 2.2.4

'text'是我构建索引的表格列。

我的索引创建查询是:

CREATE CUSTOM INDEX statistics_text_idx ON toutiao.statistics (text) USING 'com.stratio.cassandra.lucene.Index' WITH OPTIONS = {'schema': '{
            fields : {
                title: {
                                    type : "text", analyzer : "english"},
                                    category : {type:"string"},
                    genre : {type:"string"},
                    speed  : {type : "integer",sorted : true}
            }
    }', '
            refresh_seconds': '1'};

表创建查询:

DROP TABLE IF EXISTS statistics;

CREATE TABLE statistics (
source text,
timespan text,
id text,
title text,
thumbnail text,
url text,
text text,
created_at timestamp,
category text,
category2 text,
genre text,
author text,
reads int,
likes int,
comments int,
shares int,
speed int,
PRIMARY KEY (source, timespan, id)
)WITH CLUSTERING ORDER BY (timespan DESC) AND caching = '{"keys":"ALL", "rows_per_partition":"ALL"}';

这是我的数据插入程序:

cluster = Cluster(['localhost'])
session_statis = cluster.connect(keyspace)
session_statis.execute('INSERT INTO tablename(col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15) values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', (value1,value2,value3,value4,value5,value6,value7,value8,value9,value10,value11,value12,value13,value14,value15))

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

我想我知道你做得不好,

'text'是你建立索引的表格列???

你能在这里发布你的cassandra版本,cassandra-lucene-index版本和你的索引创建查询吗?

(免责声明:我在Stratio工作:))

答案 1 :(得分:1)

Doanduyhai已经在你的另一个帖子中回答了这个问题,但我想我也会在这里说话。

说到搜索'对于Cassandra数据,你有几个选择,它取决于一些东西,如SLA,易用性,免费VS. Stratio肯定是一个有趣的开源选项 - 不确定你的问题源于哪里,但我还没有在生产中看到它(我确信人们正在使用它,只是避难所见过它)

至于替代方案,你基本上有两个选择:

Option 1 - roll your own established Lucene based search API. 

您的选择是ElasticSearch或Solr。两者都有自己的优势,并有开源选项。这里的挑战是你必须管理一个单独的集群和来自Cassandra的ETL数据或双重写入。在这种情况下,您可以获得更多灵活性,因为如果您有许多系统,它可以充当通用搜索集群。这意味着您自己管理故障情景(例如裂脑问题)并且您在CQL中失去了Lucene集成。

Option 2 - Go the enterprise route (disclaimer: I work for DataStax)

DataStax Enterprise有一个非常好的集成搜索选项。 Solr与Cassandra共享相同的JVM,允许立即索引Cassandra数据并利用Cassandra可用性。还有一些很酷的查询路由可以使搜索更有效率。见:DSE Search。这显然是一种付费选项 - 尽管可以在开发中免费使用。

I lied, there is an option 3 - Build your own Lucene based search solution :)

这个选项显然是最耗费时间和资源密集型的,但如果你成功了,你将获得你想要的所有女性,葡萄酒和金钱。也许。

答案 2 :(得分:1)

为了快速测试您的查询,添加Kibana,它将生成您正在尝试完成的功能的ELK堆栈的一部分,并生成符合您要求的elasticsearch / Lucene代码。您的es将需要与您下载的Kibana版本相匹配:对于2015年12月的最新版Kibana,我必须从es 2升级到2.1以匹配当前的Kibana。由于es现在有2.2的味道,Kibana也可能升级了。啊...刚刚检查过你... 4.4的Kibana需要es 2.2 ...所以推出的速度很快。

https://www.elastic.co/downloads/kibana

披露:我的主要是gptext,madlib和plr,但我喜欢es ..... :) gptext会更像SQL ...类似于你上面的...