2008-11-04 18 views
29

मैं Lucene.net का उपयोग कर रहा हूं, लेकिन मैं .NET और Java दोनों संस्करणों के लिए इस प्रश्न को टैग कर रहा हूं क्योंकि एपीआई समान है और मुझे आशा है कि दोनों प्लेटफॉर्म पर समाधान होंगे।लुसीन क्वेरीपर्स को और क्षमा करने के लिए कैसे करें?

मुझे यकीन है कि अन्य लोगों ने इस मुद्दे को संबोधित किया है, लेकिन मुझे कोई अच्छी चर्चा या उदाहरण नहीं मिल पाए हैं।

डिफ़ॉल्ट रूप से, ल्यूसीन क्वेरी वाक्यविन्यास के बारे में बहुत पसंद है।

[ParseException: Cannot parse 'hi there!': Encountered "<EOF>" at line 1, column 9. 
Was expecting one of: 
    "(" ... 
    "*" ... 
    <QUOTED> ... 
    <TERM> ... 
    <PREFIXTERM> ... 
    <WILDTERM> ... 
    "[" ... 
    "{" ... 
    <NUMBER> ... 
    ] 
    Lucene.Net.QueryParsers.QueryParser.Parse(String query) +239 

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

ऐसा लगता है कुछ भी संभव हो, और पूरक, रणनीतियों देखते हैं कि: यह QueryProcessor

  • हैंडल अपवादों को भेजने के लिए

    • "स्वच्छ" क्वेरी से पहले शान से
      • एक बुद्धिमान दिखाएँ उपयोगकर्ता को त्रुटि संदेश
      • शायद एक साधारण क्वेरी निष्पादित करें, गलत बिट

    मेरे पास वास्तव में उन रणनीतियों को कैसे करें, इस बारे में कोई अच्छा विचार नहीं है। क्या किसी और ने इस मुद्दे को संबोधित किया है? क्या कोई "सरल" या "खूबसूरत" पार्सर्स है जो मुझे नहीं पता?

  • उत्तर

    1

    मैं आपके जैसा ही स्थिति में हूं।

    यहां मैं क्या करता हूं। मैं अपवाद पकड़ता हूं, लेकिन केवल इतना है कि मैं त्रुटि को सुंदर दिख सकता हूं। मैं पाठ नहीं बदलता हूं।

    मैं भी Lucene वाक्य रचना का एक विवरण जो मैं थोड़ा सरल बनाया है करने के लिए एक लिंक प्रदान:
    http://ifdefined.com/btnet/lucene_syntax.html

    8

    ठीक है, ऐसा करने के लिए सबसे आसान काम क्वेरी के मूल प्रारूप एक शॉट देने के लिए किया जाएगा , और यदि यह विफल रहता है, तो इसे साफ करने के लिए वापस आ जाओ।

    Query safe_query_parser(QueryParser qp, String raw_query) 
        throws ParseException 
    { 
        Query q; 
        try { 
        q = qp.parse(raw_query); 
        } catch(ParseException e) { 
        q = null; 
        } 
        if(q==null) 
        { 
         String cooked; 
         // consider changing this "" to " " 
         cooked = raw_query.replaceAll("[^\w\s]",""); 
         q = qp.parse(cooked); 
        } 
        return q; 
    } 
    

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

    आप उपयोगकर्ता की क्वेरी को टोकन करने पर भी विचार कर सकते हैं, प्रत्येक टोकन को टर्म क्वेरी में बदल सकते हैं, और उन्हें एक साथ BooleanQuery के साथ ग्लोमिंग कर सकते हैं। यदि आप वास्तव में अपने उपयोगकर्ताओं को QueryParser की विशेषताओं का लाभ उठाने की उम्मीद नहीं कर रहे हैं, तो यह सबसे अच्छा शर्त होगा। आप पूरी तरह से (?) मजबूत होंगे, और उपयोगकर्ता अपने विश्लेषक

    1

    के माध्यम से जो कुछ मज़ेदार पात्र इसे बनाएंगे, उसे खोज सकते हैं मुझे Lucene.net के बारे में बहुत कुछ पता नहीं है। सामान्य लुसीन के लिए, मैं अत्यधिक Lucene in Action पुस्तक की अनुशंसा करता हूं। सवाल के लिए, यह आपके उपयोगकर्ताओं पर निर्भर करता है। आपके उपयोगकर्ताओं के प्रश्नों को सीमित करने के लिए उपयोग, सुरक्षा और प्रदर्शन की आसानी जैसे मजबूत कारण हैं। पुस्तक QueryParser के बजाय एक कस्टम पार्सर का उपयोग कर क्वेरी को पार्स करने के तरीकों को दिखाती है।मैं BooleanQuery के बारे में जय के बारे में दूसरा विचार करता हूं, हालांकि आप एक कस्टम पार्सर का उपयोग करके मजबूत प्रश्न बना सकते हैं।

    42

    यो की तरह

    query = QueryParser.Escape(query) 
    

    कुछ के साथ क्वेरी sanitizing आप अपने उपयोगकर्ताओं को कभी अपने प्रश्नों में उन्नत सिंटैक्स का उपयोग नहीं करना चाहते हैं, तो आप इस हमेशा क्या कर सकते हैं द्वारा Lucene विशेष वर्ण को अनदेखा कर सकते हैं।

    यदि आप चाहते हैं कि आपके उपयोगकर्ता उन्नत वाक्यविन्यास का उपयोग करें, लेकिन आप उन गलतियों के साथ और अधिक क्षमा करना चाहते हैं जिन्हें आपको केवल पारसी अपवाद के बाद ही स्वच्छ करना चाहिए।

    +0

    के लिए उपयोग कर रहा हूँ मैं ParseException समस्या थी और मैं इस समाधान का इस्तेमाल किया क्योंकि मेरे उन उन्नत सिंटैक्स का उपयोग नहीं होगा। धन्यवाद ! – Costo

    1

    यदि आपको सभी लुसीन सुविधाओं की आवश्यकता नहीं है, तो आप अपनी खुद की क्वेरी पार्सर लिखकर बेहतर हो सकते हैं। यह उतना जटिल नहीं है जितना कि यह पहली जगह में प्रतीत होता है।

    3

    FYI करें ... यहाँ कोड मैं नेट

    private Query GetSafeQuery(QueryParser qp, String query) 
        { 
         Query q; 
         try 
         { 
          q = qp.Parse(query); 
         } 
    
         catch(Lucene.Net.QueryParsers.ParseException e) 
         { 
          q = null; 
         } 
    
         if(q==null) 
         { 
          string cooked; 
    
          cooked = Regex.Replace(query, @"[^\w\[email protected]]", " "); 
          q = qp.Parse(cooked); 
         } 
    
         return q; 
        } 
    
    +0

    इस उत्तर ने मूल रूप से पिछले जवाब की प्रतिलिपि बनाई। –

    +0

    @ james.garriss मुझे पता है कि यह धागा लंबा मर चुका है लेकिन मुझे यह कहना था। यद्यपि आप सही हो सकते हैं, लेकिन इससे मुझे यह सुनिश्चित करने में मदद मिली कि यह सी # में भी अपेक्षित काम करेगा। इसके अलावा, इस उत्तर में रेगेक्स अधिक पूर्ण है। :) –

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