Cassandra Полнотекстовый Поиск
полнотекстовый поиск в 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", которые я могу чувствовать хорошо о сейчас..... (ОКР сорта ногами здесь)
этот подход для меня отстой, потому что теперь мне придется удалять / повторно вставлять в любое время, когда происходит изменение сохранения / имени в "TargetIdentifier";
второе решение, было бы очень похоже только на этот раз, используя широкие столбцы; где таблица может выглядеть так:
CREATE TABLE "FullTextSearch" (
"TargetIdentifier" uuid,
"Type" int,
"CompleteText" text,
PRIMARY KEY("TargetIdentifier")
);
и теперь во время поиска что-то вроде:
SELECT * FROM "FullTextSearch" WHERE "He" = 1;
таким образом, если столбец существует, возвращаются соответствующие строки;
третий Решение: подобно приведенному выше, только на этот раз вместо использования широких столбцов мы используем столбец set, такой как map для частичных текстов, и выполняем запрос типа:
SELECT * FROM "FullTextSearch" WHERE "PartialTexts"['He'] = 1;
в любом случае, у меня все идеи, уже поздно, и я могу только надеяться на отличный ответ! Пожалуйста, дайте мне знать, что я должен здесь делать... я вообще на правильном пути?
5 ответов
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)
Я не уверен, существуют ли реализации для Elasicsearch или Solr.
Я бы не стал рекомендуем закодировать всю странную логику полнотекстового поиска, такую как stemming, поддержка нескольких/экзотических языков или даже гео-пространственный материал.
но SecondaryIndex
было бы неплохо начать интеграцию вашей любимой поисковой системы.
Если ваш набор данных относительно мал, вы можете просто использовать экземпляр inmemory lucene, обновить индекс через заданный интервал, и вы готовы к работе.
проверить СОЛАНДРА (бывший Lucandra)
но я думаю, что Solandra больше не активно развивается, автор переехал в Datastax и продолжил свою работу там.
таким образом, вы также можете взглянуть на Datastax Enterprise Search
есть некоторые ограничения также посмотреть DistributedSearch
самое основное в cassandra - если вы хотите использовать предложение where для фильтрации записей, этот столбец является первичным ключом или вам нужно назначить ему индекс, поэтому я вижу, что вы дали первичный ключ полю "TargetIdentifier" и индекс "Type" и используете "CompleteText" в предложении where, поэтому это может не сработать..
назначьте вторичный индекс "CompleteTex" и проверьте, получаете ли вы желаемый результат или нет.
пара других вариантов у вас: Stratio Lucene Плагин. Это использует Lucene для реализации собственного вторичного индекса.
У вас также есть SSTable прикрепленный вторичный индекс (SASI) доступно для свободного текстового поиска.
будьте предупреждены, что обе эти стратегии используют локально распределенные индексы, так что запросы не будут очень эффективными, так как поиск будет транслироваться по всему кластеру. Для Саси, ты можно избежать этого, если вы можете использовать ключ раздела, как часть вашего запроса.