Полнотекстовый поиск Кассандры

Полнотекстовый поиск в Кассандре;

Я новичок в Cassandra и хочу понять ее более правильно. Я пытаюсь выполнить полнотекстовый поиск в Кассандре, но после некоторых исследований я обнаружил, что для этого может быть не "простой" подход. И я говорю, может быть, потому, что первая страница Google не много говорила что-нибудь.

Итак, теперь я пытаюсь понять, что здесь лучше всего подходит. Такой подход побуждает меня принимать мои собственные предположения, основываясь на том, что я узнал до сих пор о Кассандре, основанной на этих двух директора школы; а) проектируйте свои таблицы на основе ваших запросов, а не данных, и б) больше данных - это хорошо, если оно используется должным образом.

С учетом сказанного, я придумал пару решений, которые хотел бы поделиться, а также спросить, есть ли у кого-то лучшее представление, пожалуйста, заполните меня, прежде чем я передам что-либо необоснованное/наивное.

Первое решение: создайте семейство столбцов (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%"; Однако он не будет удовлетворять частичным словам, таким как "% ell%" для "Hello", на который я могу чувствовать себя хорошо сейчас... (здесь происходит сортировка OCD)

Этот подход отстой для меня, потому что теперь мне нужно будет удалить/повторно вставить любое время, когда смена "Сохранить/имя" происходит в "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;

В любом случае, у меня все из идей, уже поздно, и я могу только надеяться на отличный ответ! Пожалуйста, дайте мне знать, что я должен делать здесь... Я даже на правильном пути?

Ответ 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.

Я бы не советовал кодировать всю странную логику полнотекстового поиска, такую как stemming, поддержка нескольких/экзотических языков или даже гео-пространственные вещи.

Но SecondaryIndex был бы хорошим началом для интеграции вашей любимой поисковой системы.

Ответ 2

Если ваш набор данных является относительно небольшим, вы можете просто использовать inmemory экземпляр lucene, обновить индекс с заданным интервалом, и вы готовы к работе.

Ответ 3

Отъезд SOLANDRA (бывшая Lucandra)

Но я думаю, что Соландра больше не активно развивается, автор переехал в Датастакс и продолжил там свою работу.

Итак, вы также можете взглянуть на Datastax Enterprise Search

Есть и некоторые ограничения, посмотрите DistributedSearch

Ответ 4

Самая простая вещь в cassandra заключается в том, что если вы хотите использовать where where для фильтрации записей, этот столбец является либо первичным ключом, либо вам нужно назначить ему индекс, так что я вижу, что вы предоставили первичный ключ для "TargetIdentifier" "поле и индекс в" Тип "и использование" CompleteText "в разделе where, поэтому это может не сработать.

Назначьте вторичный индекс "CompleteTex" и убедитесь, что вы получаете желаемый результат или нет.

Ответ 5

Пара других вариантов: плагин Stratio Lucene. Это использует Lucene для реализации вторичного вторичного индекса.

У вас также есть SSTable Attached Secondary Index (SASI), который можно использовать для свободного поиска текста.

Следует помнить, что обе эти стратегии используют локально распределенные индексы, так что запросы не будут очень результативными, поскольку поиск будет передаваться по всему кластеру. Для SASI вы можете избежать этого, если вы можете использовать ключ раздела как часть вашего запроса.

Ответ 6

Используйте elassandra, который поставляется elasticsearch как плагин в cassandra. Пример можно найти здесь