2014-07-21 65 views
9

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; 

基本上,上述將滿足以下通配符/ partialtext 「%öW%」, 「你好%」, 「WORL%」;然而,它不會滿足部分詞語,如「你好」的「%ell%」,我現在可以感覺到好吧 .....(OCD sorta踢在這裏)

這種方法很糟糕對我來說,因爲我現在必須在「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; 

反正,我全都沒有想法,已經很晚了,我只希望得到一個很好的迴應!請讓我知道我應該在這裏做什麼...我是否在正確的道路上?

回答

6

AFAIK Datastax企業搜索是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的實現是否存在。

我不會推薦編碼所有奇怪的全文搜索邏輯,如詞幹,多種/異域語言支持,甚至地理空間的東西。

SecondaryIndex將是一個很好的點開始整合自己喜歡的搜索引擎。

0

約卡桑德拉很基本的事情是,如果你想使用的where子句的記錄過濾該列是主鍵,或者你必須爲它分配索引,所以我能看到的是你已經給出了「TargetIdentifier」字段的主鍵和「Type」索引,並在where子句中使用「CompleteText」,所以這可能不起作用。

將二級索引分配給「CompleteTex」並檢查是否喲你正在得到所需的輸出或沒有。

1

如果數據集是相對較小的,你可以簡單地利用Lucene的inmemory情況下,更新在設定的時間間隔的指數,你準備好去。

0

一對夫婦的其他選項,你必須: Stratio Lucene Plugin。這使用Lucene實現本地二級索引。

您還有SSTable Attached Secondary Index (SASI)可用於免費文字搜索。

事先警告,這兩種策略的使用本地分佈式索引,使得查詢將不會很高性能的,因爲搜索最終將整個集羣內廣播。對於SASI,如果您可以將分區鍵用作查詢的一部分,則可以避免這種情況。