gpt4 book ai didi

Cassandra 全文搜索

转载 作者:行者123 更新时间:2023-12-04 01:07:12 26 4
gpt4 key购买 nike

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");

使用上表,我需要为文本“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;

基本上,以上将满足以下通配符/部分文本 "%o W%", "Hello%", "Worl%";然而,它不会满足部分词,例如“你好”的“%ell%”,我现在感觉还好......(强制症在这里踢)

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

第二种解决方案,只是这次使用宽列会非常相似;表格可能如下所示:
CREATE TABLE "FullTextSearch" (
"TargetIdentifier" uuid,
"Type" int,
"CompleteText" text,
PRIMARY KEY("TargetIdentifier")
);

现在在搜索过程中,例如:
SELECT * FROM "FullTextSearch" WHERE "He" = 1;

以便如果该列存在,则返回相应的行;

第三个解决方案:
与上面的类似,只是这次我们不使用宽列,而是使用诸如 map 之类的集合列作为部分文本,并执行如下查询:
SELECT * FROM "FullTextSearch" WHERE "PartialTexts"['He'] = 1;

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

最佳答案

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将是开始集成您最喜欢的搜索引擎的好点。

关于Cassandra 全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com