2014-07-21 14 views
9

कैसंड्रा में पूर्ण-पाठ खोज;कैसंड्रा पूर्ण-पाठ खोज

मैं कैसंद्रा के लिए बिल्कुल नया हूं, और इसे और अधिक सही ढंग से समझना चाहता हूं। मैं कैसंद्रा में एक पूर्ण-पाठ खोज करने का प्रयास कर रहा हूं, लेकिन कुछ शोध के बाद मुझे पता चला है कि इसके लिए "सरल" दृष्टिकोण नहीं है .. और मैं कह सकता हूं क्योंकि 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"); 

उपरोक्त तालिका के साथ, मैं पाठ के लिए पंक्तियां सम्मिलित करने की आवश्यकता होगी "नमस्ते दुनिया" इस प्रकार है:

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; 

असल में, इसके बाद के संस्करण "ओ डब्ल्यू%%", "नमस्ते%", "Worl%" निम्न वाइल्डकार्ड/partialtext को पूरा करेगा; हालांकि यह इस तरह "हैलो" के लिए "% ell%" है, जो मैं ठीक अब के लिए के बारे में महसूस कर सकते हैं के रूप में आंशिक शब्द को संतुष्ट नहीं करेगा ..... (ओसीडी 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 का उत्तराधिकारी है।

कैसेंड्रा 2.0 तो "कस्टम माध्यमिक अनुक्रमणिका" कहा जाता है का समर्थन करता है। कस्टम माध्यमिक अनुक्रमणिका जावा कोड हैं। अपने खुद के कार्यान्वयन (http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/create_index_r.html देखें)

सार वर्ग org.apache.cassandra.db.index.SecondaryIndex लागू करने के लिए मैं यकीन नहीं है कि कार्यान्वयन Elasicsearch या Solr के लिए मौजूद नहीं कर रहा हूँ है।

मेरा सुझाव नहीं होगा उत्पन्न, कई/विदेशी भाषा समर्थन की तरह सभी अजीब पूर्ण पाठ खोज तर्क कोड करने के लिए या यहां तक ​​कि स्थानिक सामान भू।

लेकिन SecondaryIndex एक अच्छा बिंदु अपने पसंदीदा खोज इंजन को एकीकृत शुरू करने के लिए किया जाएगा।

0

बाहर चेक SOLANDRA (पूर्व Lucandra)

लेकिन मुझे लगता है Solandra सक्रिय रूप से किसी भी अधिक नहीं विकसित किया जा रहा है, लेखक Datastax चले गए और वहां अपना काम जारी रखा।

तो तुम भी Datastax Enterprise Search

पर एक नज़र ले जा सकते हैं वहाँ कुछ सीमा भी कर रहे हैं, DistributedSearch

0

कैसेंड्रा के बारे में बहुत ही बुनियादी बात आप उपयोग करना चाहते हैं है पर देखने जहां अभिलेखों का निस्पंदन उस स्तंभ के लिए खंड या तो प्राथमिक कुंजी है या आपको इसे इंडेक्स असाइन करना है, इसलिए मैं क्या देख सकता हूं कि आपने "टार्गेटइडिएंफायर" फ़ील्ड और इंडेक्स को "टाइप" करने के लिए प्राथमिक कुंजी दी है और "पूर्ण टेक्स्ट" का उपयोग करके जहां क्लॉज काम नहीं कर सकता है ..

"पूर्ण टेक्स्ट" में द्वितीयक अनुक्रमणिका असाइन करें और जांचें कि क्या यो आप वांछित आउटपुट प्राप्त कर रहे हैं या नहीं।

1

आपके डेटासेट रिश्तेदार है छोटा सा आप बस, Lucene की एक inmemory उदाहरण उपयोग कर सकते हैं एक सेट अंतराल पर अनुक्रमणिका को अपडेट करते हैं और आप जाने के लिए तैयार कर रहे हैं।

0

आपके पास कुछ अन्य विकल्प हैं: Stratio Lucene Plugin। यह देशी माध्यमिक सूचकांक को लागू करने के लिए लुसीन का उपयोग करता है।

तुम भी SSTable Attached Secondary Index (SASI) मुक्त पाठ खोज के लिए उपयोग करने के लिए उपलब्ध है।

सावधान रहें कि इन दोनों रणनीतियों में स्थानीय रूप से वितरित इंडेक्स का उपयोग किया जाता है, जैसे कि प्रश्न पूरी तरह से प्रदर्शन नहीं करेंगे क्योंकि खोज पूरे क्लस्टर में प्रसारित हो जाएंगी। एसएएसआई के लिए, यदि आप अपनी क्वेरी के हिस्से के रूप में विभाजन कुंजी का उपयोग कर सकते हैं तो आप इससे बच सकते हैं।