Cassandra全文搜索

use*_*264 12 full-text-search cql cassandra

在Cassandra的全文搜索;

我对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");
Run Code Online (Sandbox Code Playgroud)

使用上表,我需要为文本"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;
Run Code Online (Sandbox Code Playgroud)

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

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

第二种解决方案,这次使用宽柱只会非常相似; 表可能看起来像:

CREATE TABLE "FullTextSearch" (
"TargetIdentifier" uuid,
"Type" int,
"CompleteText" text,
PRIMARY KEY("TargetIdentifier")
);
Run Code Online (Sandbox Code Playgroud)

现在在搜索期间:

SELECT * FROM "FullTextSearch" WHERE "He" = 1;
Run Code Online (Sandbox Code Playgroud)

这样如果列存在,则返回相应的行;

第三个解决方案:与上面的解决方案类似,只是这一次,而不是使用宽列,我们使用设置列,例如部分文本的映射,并执行如下查询:

SELECT * FROM "FullTextSearch" WHERE "PartialTexts"['He'] = 1;
Run Code Online (Sandbox Code Playgroud)

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

小智 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开始整合你最喜欢的搜索引擎是个好点.