Cassandra全文搜索

时间:2014-07-21 05:18:43

标签: cassandra full-text-search cql

Cassandra的全文搜索;

我对卡桑德拉来说相当新,并希望更恰当地理解它。我试图在Cassandra中进行全文搜索,但经过一些研究后我发现可能不是一个“简单”的方法...我说可能是因为第一页谷歌没有说太多东西。

所以我现在试着去理解,这里最好的方法是什么..这种方式让我根据我迄今为止所学到的关于Cassandra的内容来构建我自己的假设,这是基于这两个校长; a)根据您的查询而不是数据设计您的表格,b)只要正确使用数据,更多数据是一件好事。

话虽如此,我想出了一些我想分享的解决方案,并且还要求如果有人有更好的想法,请在我承诺任何不合理/天真之前填写我。

第一个解决方案:创建一个列族(CF),其中包含两个主键和一个索引,如下所示:

CREATE TABLE "FullTextSearch" (
"PartialText" text,
"TargetIdentifier" uuid,
"CompleteText" text,
"Type" int,
PRIMARY KEY ("PartialText","TargetIdentifier")
);
CREATE INDEX IX_FullTextSearch_Type "keyspace"."FullTextSearch" ("Type");

使用上表,我需要为文本“Hello World”插入行,如下所示:

BATCH APPLY;
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("H",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("He",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hel",000000000-0000-0000-0000-000000000,"Hello World",1);
.....
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hello Wor",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hello Worl",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hello World",000000000-0000-0000-0000-000000000,"Hello World",1);
.....
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Wor",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Worl",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("World",000000000-0000-0000-0000-000000000,"Hello World",1);
END BATCH;

基本上,上面将满足以下通配符/ partialtext“%o W%”,“Hello%”,“Worl%”;但是它不会满足部分单词,例如“Hello”的“%ell%”,我现在可以感觉好的 ......(OCD sorta在这里踢)

这种方法对我来说很糟糕,因为我现在必须在“TargetIdentifier”上发生保存/名称更改时删除/重新插入;

第二种解决方案,这次使用宽柱只会非常相似;表格可能如下所示:

CREATE TABLE "FullTextSearch" (
"TargetIdentifier" uuid,
"Type" int,
"CompleteText" text,
PRIMARY KEY("TargetIdentifier")
);

现在在搜索期间:

SELECT * FROM "FullTextSearch" WHERE "He" = 1;

因此,如果列存在,则返回相应的行;

第三种解决方案: 与上面的类似,只是这一次,而不是使用宽列,我们使用诸如地图之类的设置列作为部分文本,并执行如下查询:

SELECT * FROM "FullTextSearch" WHERE "PartialTexts"['He'] = 1;

无论如何,我完全没有想法,已经很晚了,我只能希望得到很好的回应!请让我知道我应该在这做什么......我是否正走在正确的道路上?

6 个答案:

答案 0 :(得分:7)

AFAIK Datastax Enterprise Search是Solandra的(商业)继承者。

Cassandra 2.0支持所谓的“自定义二级索引”。 自定义二级索引是Java代码。您自己的实现必须实现抽象类org.apache.cassandra.db.index.SecondaryIndex (见http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/create_index_r.html

我不确定Elasticsearch或Solr是否存在实现。

我不建议编写所有奇怪的全文搜索逻辑,如词干,多/异国语言支持甚至地理空间的东西。

SecondaryIndex是开始整合您最喜欢的搜索引擎的好点。

答案 1 :(得分:1)

如果您的数据集相对较小,您可以简单地使用lucene的内存实例,以设定的间隔更新索引,您就可以开始了。

答案 2 :(得分:0)

查看SOLANDRA(前Lucandra)

但我认为Solandra不再被积极开发,作者转移到Datastax继续他的工作。

所以你也可以看看Datastax Enterprise Search

还有一些限制,请看DistributedSearch

答案 3 :(得分:0)

关于cassandra的最基本的事情是,如果你想使用where子句来过滤记录,那么列是主键,或者你必须为它分配索引,所以我可以看到你给了主键“TargetIdentifier” “字段和索引”类型“并在where子句中使用”CompleteText“,因此这可能不起作用..

将二级索引分配给“CompleteTex”并检查您是否获得了所需的输出。

答案 4 :(得分:0)

您还有其他几种选择: Stratio Lucene Plugin。这使用Lucene实现本机二级索引。

您还可以使用SSTable Attached Secondary Index (SASI)进行自由文本搜索。

预先警告这两种策略都使用本地分布式索引,这样查询的性能就不会很高,因为搜索最终会在整个集群中进行广播。对于SASI,如果可以使用分区键作为查询的一部分,则可以避免这种情况。

答案 5 :(得分:0)

使用elassandra附带的elasticsearch作为cassandra中的插件。 可以从here

找到一个示例