2014-07-21 18 views
9

Tìm kiếm toàn văn trong Cassandra;Tìm kiếm toàn văn Cassandra

Tôi khá mới với Cassandra, và muốn hiểu nó đúng hơn. Tôi đang cố gắng thực hiện tìm kiếm Toàn văn trong Cassandra, nhưng sau một số nghiên cứu tôi đã thấy rằng có có thể không phải là cách tiếp cận "đơn giản" cho điều này .. và tôi nói có thể là vì trang đầu tiên của Google chưa từng nói nhiều thứ.

Vì vậy, tôi đang cố gắng để hiểu ngay bây giờ, cách tiếp cận tốt nhất ở đây là gì .. Loại này dẫn tôi để tạo nên các giả định của riêng tôi dựa trên những gì tôi đã học được cho đến nay về Cassandra, đó là dựa trên những hai hiệu trưởng; a) thiết kế các bảng của bạn dựa trên các truy vấn của bạn, thay vì dữ liệu và b) nhiều dữ liệu hơn là một điều tốt, miễn là nó đang được sử dụng đúng cách.

Với điều đó được nói, tôi đã đưa ra một vài giải pháp mà tôi muốn chia sẻ, và cũng hỏi rằng nếu có ai có ý tưởng hay hơn, vui lòng điền vào nó trước khi tôi cam kết bất cứ điều gì không hợp lý/ngây thơ .

Giải pháp thứ nhất: Tạo một gia đình Cột (CF), với hai khóa chính và một Index như vậy:

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

Với bảng trên, tôi sẽ cần phải chèn hàng cho các văn bản "Hello World" như sau:

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; 

Về cơ bản, ở trên sẽ thỏa mãn các ký tự đại diện/một phần văn bản "% o W%", "Hello%", "Worl%"; Tuy nhiên nó sẽ không đáp ứng một phần từ như "% ell%" cho "Xin chào", mà tôi có thể cảm thấy alright về bây giờ ..... (OCD sorta đá ở đây)

Cách tiếp cận này loại sucks cho tôi bởi vì bây giờ tôi sẽ phải xóa/chèn lại bất cứ lúc nào một thay đổi lưu/tên xảy ra trên "TargetIdentifier";

Giải pháp thứ hai, sẽ rất giống với lần này khi sử dụng cột rộng; nơi bàn có thể trông giống như:

CREATE TABLE "FullTextSearch" (
"TargetIdentifier" uuid, 
"Type" int, 
"CompleteText" text, 
PRIMARY KEY("TargetIdentifier") 
); 

và bây giờ trong một cái gì đó tìm kiếm như:

SELECT * FROM "FullTextSearch" WHERE "He" = 1; 

để nếu cột tồn tại, các hàng tương ứng được trả về;

Giải pháp thứ ba: tương tự như trên, chỉ có thời gian này thay vì sử dụng rộng cột chúng tôi sử dụng một bộ cột như bản đồ cho các văn bản một phần, và thực hiện một truy vấn như:

SELECT * FROM "FullTextSearch" WHERE "PartialTexts"['He'] = 1; 

Anyways , Tôi tất cả ra khỏi ý tưởng, nó là muộn, và tôi chỉ có thể hy vọng cho một phản ứng tuyệt vời! Xin vui lòng, cho tôi biết những gì tôi nên làm ở đây ... tôi thậm chí trên con đường bên phải?

Trả lời

6

AFAIK Datastax Enterprise Search là người kế thừa (thương mại) của Solandra.

Cassandra 2.0 hỗ trợ cái gọi là "chỉ mục phụ tùy chỉnh". Chỉ mục phụ tùy chỉnh là mã Java. Việc triển khai của riêng bạn phải triển khai lớp trừu tượng org.apache.cassandra.db.index.SecondaryIndex (Xem http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/create_index_r.html)

Tôi không chắc liệu các triển khai có tồn tại cho Elasicsearch hay Solr hay không.

Tôi sẽ không khuyên bạn nên mã hóa tất cả các logic tìm kiếm văn bản đầy đủ lạ như bắt nguồn, hỗ trợ đa ngôn ngữ/kỳ lạ hoặc thậm chí cả các công cụ không gian địa lý.

Nhưng SecondaryIndex sẽ là một điểm tốt để bắt đầu tích hợp công cụ tìm kiếm yêu thích của bạn.

0

Check-out SOLANDRA (cựu Lucandra)

Nhưng tôi nghĩ Solandra không được tích cực phát triển nữa, tác giả chuyển sang Datastax và tiếp tục công việc của mình ở đó.

Vì vậy, Bạn cũng có thể có một cái nhìn tại Datastax Enterprise Search

Có một số giới hạn cũng có, nhìn vào DistributedSearch

0

Các điều rất cơ bản về cassandra là nếu bạn muốn sử dụng mệnh đề where để lọc các bản ghi cột đó hoặc là khóa chính hoặc bạn phải gán chỉ mục cho nó, vì vậy những gì tôi có thể thấy là bạn đã gán khóa chính cho trường "TargetIdentifier" và chỉ mục "Type" và sử dụng "CompleteText" trong mệnh đề where để điều này có thể không hoạt động ..

Gán chỉ mục phụ cho "CompleteTex" và kiểm tra xem liệu yo u đang nhận được sản lượng mong muốn hay không.

1

Nếu tập dữ liệu của bạn là tương đối nhỏ, bạn có thể chỉ cần sử dụng một thể hiện inmemory của lucene, cập nhật chỉ mục tại một khoảng thời gian và bạn đã sẵn sàng để đi.

0

Một vài tùy chọn khác mà bạn có: Stratio Lucene Plugin. Điều này sử dụng Lucene để triển khai chỉ mục thứ cấp gốc.

Bạn cũng có sẵn SSTable Attached Secondary Index (SASI) để sử dụng tìm kiếm văn bản miễn phí.

Hãy cảnh báo trước rằng cả hai chiến lược này đều sử dụng các chỉ mục được phân phối cục bộ để truy vấn sẽ không thực hiện được vì các tìm kiếm sẽ được phát trên toàn bộ cụm. Đối với SASI, bạn có thể tránh điều này nếu bạn có thể sử dụng khóa phân vùng như một phần của truy vấn của mình.

Các vấn đề liên quan