2012-04-07 7 views
13

मैं जावा/स्कैला लाइब्रेरी की तलाश में हूं जो उपयोगकर्ता क्वेरी और टेक्स्ट ले सकता है और यदि मिलान हो या नहीं तो रिटर्न कर सकता है।बूलियन खोज सिंटेक्स का उपयोग कर जावा स्ट्रिंग मिलान कैसे करें?

मैं जानकारी की एक स्ट्रीम संसाधित कर रहा हूं, यानी: ट्विटर स्ट्रीम, और बैचिंग प्रक्रिया का उपयोग करने का जोखिम नहीं उठा सकता है, मुझे ल्यूसीन रैमडिस्क के माध्यम से इसे इंडेक्स के बजाय रीयलटाइम में प्रत्येक ट्वीट का मूल्यांकन करने और बाद में पूछताछ करने की आवश्यकता है।

ANTLR का उपयोग करके एक पार्सर/लेक्सर बनाना संभव है लेकिन यह इतना आम उपयोग है कि मुझे विश्वास नहीं है कि कोई भी पहले कोई lib बना नहीं सकता है।

TextQuery Ruby library से कुछ नमूने है कि वास्तव में करता है कि मैं क्या जरूरत है:

TextQuery.new("'to be' OR NOT 'to_be'").match?("to be") # => true 

    TextQuery.new("-test").match?("some string of text")  # => true 
    TextQuery.new("NOT test").match?("some string of text") # => true 

    TextQuery.new("a AND b").match?("b a")     # => true 
    TextQuery.new("a AND b").match?("a c")     # => false 

    q = TextQuery.new("a AND (b AND NOT (c OR d))") 
    q.match?("d a b")           # => false 
    q.match?("b")            # => false 
    q.match?("a b cdefg")          # => true 

    TextQuery.new("a~").match?("adf")       # => true 
    TextQuery.new("~a").match?("dfa")       # => true 
    TextQuery.new("~a~").match?("daf")      # => true 
    TextQuery.new("2~a~1").match?("edaf")      # => true 
    TextQuery.new("2~a~2").match?("edaf")      # => false 

    TextQuery.new("a", :ignorecase => true).match?("A b cD") # => true 

एक बार जब यह रूबी में लागू किया गया था यह मेरे मंच के लिए उपयुक्त नहीं है, यह भी मैं सिर्फ हमारे समाधान पर इस बात के लिए JRuby का उपयोग नहीं कर सकते हैं:

मैं एक ऐसी ही सवाल पाया लेकिन यह से जवाब नहीं मिल सका: Boolean Query/Expression to a Concrete syntax tree

धन्यवाद!

+0

@edgarespina ने मुझे अभी [Parboiled] (https://github.com/sirthias/parboiled/) के बारे में बताया है, यह रूबी के लिए ट्रीटॉप के साथ बहुत समान लगता है। शायद यह सबसे आसान समाधान है। – arjones

उत्तर

3

यह देखते हुए कि आप टेक्स्ट खोज कर रहे हैं, मैं लुसीन द्वारा प्रदान किए गए कुछ बुनियादी ढांचे का लाभ उठाने का प्रयास करूंगा। हो सकता है कि आप बना सकते हैं और Query वापस पाने के लिए parse पर कॉल कर सकते हैं। क्वेरी की Instantiable उपवर्गों हैं:

TermQuery 
MultiTermQuery 
BooleanQuery 
WildcardQuery 
PhraseQuery 
PrefixQuery 
MultiPhraseQuery 
FuzzyQuery 
TermRangeQuery 
NumericRangeQuery 
SpanQuery 

तो फिर तुम पैटर्न मिलान का उपयोग करने के लिए लागू करने के लिए क्या एक मैच आपके आवेदन के लिए इसका मतलब है सक्षम हो सकते हैं:

def match_?(tweet: String, query: Query): Boolean = query match { 
    case q: TermQuery => tweet.contains(q.getTerm.text) 
    case q: BooleanQuery => 
    // return true if all must clauses are satisfied 
    // call match_? recursively 
    // you need to cover all subclasses above 
    case _ => false 
} 

val q = queryParser.parse(userQuery) 
val res = match_?(tweet, q) 

यहाँ an implementation है। इसमें निश्चित रूप से बग हैं लेकिन आपको विचार मिल जाएगा और यह अवधारणा का एक कार्य प्रमाण दिखाता है। यह डिफ़ॉल्ट ल्यूसीन क्वेरीपर्सर के सिंटैक्स, दस्तावेज़ीकरण और व्याकरण का पुन: उपयोग करता है।

3

वसंत अभिव्यक्ति भाषा (SpEL)matches ऑपरेटर का समर्थन करता है जो नियमित अभिव्यक्तियों के आधार पर boolean एस देता है। उपयोग के लिए प्रलेखन के this अनुभाग देखें।

यह आपको and, or और not जैसे लॉजिकल ऑपरेटरों का उपयोग करने की अनुमति देगा।

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