Cassandra Pesquisa De Texto Completo

pesquisa de texto completo em Cassandra;

Sou novo na Cassandra e quero compreendê-lo melhor. Estou a tentar realizar uma pesquisa de texto completo em Cassandra, mas depois de algumas pesquisas descobri que lá Maio não ser uma abordagem "simples" para isto.. e eu digo talvez porque a primeira página do Google não disse grande coisa.

Então, estou tentando entender agora, qual é a melhor abordagem aqui.. Isto leva-me a tomar as minhas próprias decisões. suposições baseadas no que eu aprendi até agora sobre Cassandra, que é baseado nestes dois princípios; a) projetar suas tabelas com base em suas consultas, ao invés dos dados, e B) mais-dados é uma coisa boa, desde que esteja sendo usado corretamente.

Dito isto, tenho algumas soluções que gostaria de partilhar, e também peço que se alguém tiver uma ideia melhor, por favor, preencha-me antes de me comprometer com algo irracional/ingênuo.

primeira solução: criar uma coluna Família (CF), com duas chaves primárias e um índice como este:

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

com a tabela acima, eu precisaria de inserir linhas para o texto "Olá Mundo" da seguinte forma:

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;

basicamente, o acima irá satisfazer as seguintes caracteres especiais/text parcial "%O W%", "Hello%", "Worl%"; no entanto, não irá satisfazer palavras parciais como "%ell%" para "Hello", que eu posso sentir Tudo por agora..... (OCD mais ou menos bate aqui)

Esta abordagem é uma treta para mim, porque eu agora o faria. ter de apagar/voltar a inserir sempre que ocorra uma alteração de save / nome no "TargetIdentifier";

a segunda solução, seria muito semelhante apenas desta vez fazendo uso de colunas largas; onde a tabela poderia parecer:

CREATE TABLE "FullTextSearch" (
"TargetIdentifier" uuid,
"Type" int,
"CompleteText" text,
PRIMARY KEY("TargetIdentifier")
);
E agora durante uma busca algo como:
SELECT * FROM "FullTextSearch" WHERE "He" = 1;

de modo que, se a coluna existir, as respectivas linhas sejam devolvidas;

Terceira Solução: semelhante ao acima, só que desta vez, em vez de usar colunas largas, usamos uma coluna definida, como o mapa para o textos parciais, e realizar uma consulta como:

SELECT * FROM "FullTextSearch" WHERE "PartialTexts"['He'] = 1;
Enfim, estou sem ideias, é tarde, e só posso esperar uma grande resposta! Por favor, diz-me o que devo fazer aqui... estou no caminho certo?

Author: user1953264, 2014-07-21

5 answers

A AFAIK Datastax Enterprise Search é a sucessora (comercial) da Solandra. A Cassandra 2.0 suporta os chamados "índices secundários personalizados". Os índices secundários personalizados são o código Java. Sua própria implementação tem que implementar a classe abstrata org.apache.cassandra.db.index.SecondaryIndex (Ver http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/create_index_r.html)

Não sei se existem implementações para pesquisa Elasic ou Solr.

Eu não recomendaria codificar todas as lógica de pesquisa de texto como stemming, suporte de linguagem múltipla/exótica ou mesmo coisas geo-espaciais.

Mas SecondaryIndex seria um bom ponto para começar a integrar o seu motor de busca favorito.

 7
Author: Robert Stupp, 2014-07-23 20:57:59

Se o seu conjunto de dados for relativamente pequeno, pode simplesmente usar uma instância inmemory de lucene, actualizar o índice num intervalo definido e está pronto para ir.

 1
Author: TinusSky, 2014-07-21 08:55:35

Check out SOLANDRA (former Lucandra)

Mas acho que a Solandra já não está a ser activamente desenvolvida, o autor mudou-se para Datastax e continuou o seu trabalho lá.

Para que também possa dar uma vista de olhos à procura da empresa Datastax

Existem também algumas limitações, veja pesquisa distribuída

 0
Author: Jignesh Dhua, 2014-07-21 06:35:35

A coisa mais básica sobre a cassandra é se você quiser usar onde a cláusula para filtração de registros que a coluna é ou chave primária ou você tem que atribuir índice a ela, então o que eu posso ver é que você deu chave primária para o campo "TargetIdentifier" e índice para "tipo" e usando "CompleteText" onde a cláusula pode não funcionar..

Atribuir o índice secundário ao" CompleteTex " e verificar se está a obter o resultado desejado ou não.

 0
Author: Working Hard.., 2014-07-21 06:42:28

Mais algumas opções que você tem: 'Plugin' De Stratio Lucene . Isto usa Luceno para implementar um índice secundário nativo.

Também tem O índice secundário (SASI) disponível para a pesquisa de texto livre.

Seja avisado que ambas as estratégias usam índices distribuídos localmente de tal forma que as consultas não serão muito eficazes, uma vez que as pesquisas acabarão por ser transmitidas por todo o conjunto. Para SASI, você pode evitar isso se você pode usar uma chave de partição como parte de sua consulta.

 0
Author: Jason White, 2017-10-07 00:21:51