2012-05-31 7 views
8
  1. जब MySQL में कोई नया आइटम जोड़ा जाता है, तो इसे लुसीन द्वारा भी अनुक्रमित किया जाना चाहिए।
  2. जब कोई मौजूदा आइटम MySQL से हटा दिया जाता है, तो इसे लुसेन की अनुक्रमणिका से भी हटा दिया जाना चाहिए।

विचार एक स्क्रिप्ट लिखना है जिसे शेड्यूलर (जैसे एक सीआरओएन कार्य) के माध्यम से हर एक्स मिनट कहा जाएगा। यह MySQL और लुसीन सिंक्रनाइज़ करने का एक तरीका है। मैंने अभी तक प्रबंधित किया है:अपाचे ल्यूसीन के साथ एक MySQL डेटाबेस इंडेक्स करें, और उन्हें सिंक्रनाइज़ करें

  1. MySQL में प्रत्येक नए जोड़े गए आइटम के लिए, लुसीन भी इसे अनुक्रमित करता है।
  2. MySQL में पहले से जोड़े गए प्रत्येक आइटम के लिए, लुसीन इसे पुन: संशोधित नहीं करता है (कोई डुप्लिकेट आइटम नहीं)।

इस बिंदु मैं आप कुछ मदद का प्रबंधन करने के पूछ रहा हूँ है:

  1. प्रत्येक पूर्व में जोड़े आइटम के लिए है कि तब MySQL से हटा दिया गया है, Lucene भी यह unindex चाहिए।

    public static void main(String[] args) throws Exception { 
    
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", ""); 
        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); 
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer); 
        IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR), config); 
    
        String query = "SELECT id, name FROM tag"; 
        Statement statement = connection.createStatement(); 
        ResultSet result = statement.executeQuery(query); 
    
        while (result.next()) { 
         Document document = new Document(); 
         document.add(new Field("id", result.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
         document.add(new Field("name", result.getString("name"), Field.Store.NO, Field.Index.ANALYZED)); 
         writer.updateDocument(new Term("id", result.getString("id")), document); 
        } 
    
        writer.close(); 
    
    } 
    

    पुनश्च::

यहाँ कोड मैं प्रयोग किया जाता है, जो सूचकांक करने के लिए एक MySQL तालिका tag (id [PK] | name) की कोशिश करता है इस कोड को केवल, कोई ज़रूरत नहीं मुझे बताओ कि यह कैसे भयानक है परीक्षण उद्देश्य के लिए है :)

संपादित करें:

एक समाधान किसी भी previsouly जोड़ा दस्तावेज़ नष्ट करने के लिए किया जा सकता है, और सभी डेटाबेस पुन: अनुक्रमणिका:

writer.deleteAll(); 
while (result.next()) { 
    Document document = new Document(); 
    document.add(new Field("id", result.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
    document.add(new Field("name", result.getString("name"), Field.Store.NO, Field.Index.ANALYZED)); 
    writer.addDocument(document); 
} 

मुझे यकीन नहीं है कि यह सबसे अनुकूलित समाधान है, है ना?

+0

आपने क्या किया? –

उत्तर

7

जब तक आप अपने आवेदन से अलग से इंडेक्सिंग/रीइंडेक्सिंग को चलाने देते हैं, तो आपके पास सिंक्रनाइज़ेशन समस्याएं होंगी। आपके काम के क्षेत्र के आधार पर, यह कोई समस्या नहीं हो सकती है, लेकिन कई समवर्ती-उपयोगकर्ता-अनुप्रयोगों के लिए यह है।

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

हमने दो संभावनाएं देखी: या तो खोज सूचकांक के अपडेट के लिए व्यापार तर्क को कसकर कनेक्ट करें, या एक कठिन एसिंक्रोनस अपडेट कार्य को लागू करें। हमने बाद में किया।

पृष्ठभूमि में, टोमकैट एप्लिकेशन के अंदर एक समर्पित थ्रेड में चल रही एक कक्षा है जो अद्यतन लेती है और समानांतर में चलता है। बैकऑफिस अपडेट के लिए प्रतीक्षा समय के लिए प्रतीक्षा समय 0.5-2 सेकंड तक है, जो पहले स्तर के समर्थन के लिए समस्याओं को बहुत कम करता है। और, यह उतना ही कम हो सकता है जितना हो सकता है, हम एक अलग इंडेक्सिंग इंजन भी कार्यान्वित कर सकते हैं।

1

Solr DataImportScheduler दृष्टिकोण पर एक नज़र डालें।
मूल रूप से, जब कोई वेब एप्लिकेशन प्रारंभ होता है, तो एक अलग टाइमर थ्रेड उत्पन्न होता है, जो समय-समय पर सोलर के खिलाफ HTTP पोस्ट को सक्रिय करता है, जो तब आपके द्वारा आरडीबी (और अन्य डेटा स्रोतों) से डेटा खींचने के लिए सेट किए गए DataImportHandler का उपयोग करता है।

इसलिए, चूंकि आप सोलर का उपयोग नहीं कर रहे हैं, केवल लुसीन, आपको विचारों के लिए DataImportHandler source पर एक नज़र रखना चाहिए।

संबंधित मुद्दे