2011-03-31 10 views
10

में इंडेक्सिंग और खोज दिनांक DateTools.dateToString() विधि के साथ इंडेक्स तिथि के लिए मैंने कोशिश की। यह इंडेक्सिंग के साथ-साथ खोज के लिए ठीक से काम कर रहा है।लुसेन

लेकिन मेरे पहले से अनुक्रमित डेटा जिसमें कुछ संदर्भ हैं, इस तरह से इसने दिनांक Date().getTime() के रूप में सूचीबद्ध किया है।

तो मेरी समस्या यह है कि इस डेटा के RangeSearch Query प्रदर्शन करने के लिए है ...

इस के लिए कोई समाधान ???

अग्रिम में धन्यवाद।

+0

लुसीन का संस्करण, लुसीन <2.9 केवल लेक्सोग्राफिक रेंज क्वेरी करता है, आपको उस मामले में सटीक दिनांक प्रारूप निर्दिष्ट करने की आवश्यकता हो सकती है !! – Narayan

+1

मैं 2.9.1 का उपयोग कर रहा हूं। क्या मुझे केवल विशिष्ट दिनांक प्रारूप का उपयोग करने की आवश्यकता है? यह GetTime() के साथ काम नहीं करेगा? – user660024

उत्तर

17

आपको अपने दिनांक फ़ील्ड पर TermRangeQuery का उपयोग करने की आवश्यकता है। ठीक से काम करने के लिए उस क्षेत्र को हमेशा DateTools.dateToString() के साथ अनुक्रमित करने की आवश्यकता है। यहाँ अनुक्रमण की एक पूरी उदाहरण है और Lucene 3.0 के साथ किसी समय अवधि पर खोज:

public class LuceneDateRange { 
    public static void main(String[] args) throws Exception { 
     // setup Lucene to use an in-memory index 
     Directory directory = new RAMDirectory(); 
     Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); 
     MaxFieldLength mlf = MaxFieldLength.UNLIMITED; 
     IndexWriter writer = new IndexWriter(directory, analyzer, true, mlf); 

     // use the current time as the base of dates for this example 
     long baseTime = System.currentTimeMillis(); 

     // index 10 documents with 1 second between dates 
     for (int i = 0; i < 10; i++) { 
      Document doc = new Document(); 
      String id = String.valueOf(i); 
      String date = buildDate(baseTime + i * 1000); 
      doc.add(new Field("id", id, Store.YES, Index.NOT_ANALYZED)); 
      doc.add(new Field("date", date, Store.YES, Index.NOT_ANALYZED)); 
      writer.addDocument(doc); 
     } 
     writer.close(); 

     // search for documents from 5 to 8 seconds after base, inclusive 
     IndexSearcher searcher = new IndexSearcher(directory); 
     String lowerDate = buildDate(baseTime + 5000); 
     String upperDate = buildDate(baseTime + 8000); 
     boolean includeLower = true; 
     boolean includeUpper = true; 
     TermRangeQuery query = new TermRangeQuery("date", 
       lowerDate, upperDate, includeLower, includeUpper); 

     // display search results 
     TopDocs topDocs = searcher.search(query, 10); 
     for (ScoreDoc scoreDoc : topDocs.scoreDocs) { 
      Document doc = searcher.doc(scoreDoc.doc); 
      System.out.println(doc); 
     } 
    } 

    public static String buildDate(long time) { 
     return DateTools.dateToString(new Date(time), Resolution.SECOND); 
    } 
} 
+0

+1 काम कोड देखने के लिए हमेशा अच्छा है – Bohemian

3

तुम बहुत बेहतर खोज प्रदर्शन अगर आप अपने तिथि के लिए एक NumericField का उपयोग मिल जाएगा, और फिर NumericRangeFilter/क्वेरी रेंज खोज करने के लिए ।

आपको बस अपनी तिथि को लंबे या int के रूप में एन्कोड करना होगा। एक आसान तरीका है अपनी तिथि की .getTime() विधि को कॉल करना, लेकिन यह आपकी आवश्यकता से कहीं अधिक रिज़ॉल्यूशन (मिली-सेकेंड) हो सकता है। यदि आपको केवल दिन की आवश्यकता है, तो आप इसे YYYYMMDD पूर्णांक के रूप में एन्कोड कर सकते हैं।

फिर, खोज समय पर, अपनी शुरुआत/समाप्ति तिथियों पर समान रूपांतरण करें और संख्यात्मक श्रेणी/फ़िल्टर चलाएं।

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