2012-04-07 48 views
13

我正在尋找一個Java/Scala庫,可以接受用戶查詢和文本,並在有匹配或不匹配的情況下返回。如何使用布爾搜索語法進行Java字符串匹配?

我正在處理信息流,即:Twitter Stream,並且無法使用批處理過程,因此我需要實時評估每條推文,而不是通過Lucene RAMDisk對其進行索引並稍後查詢。

這是可能的使用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 

一旦有人Ruby實現它不適合我的平臺,我也不能使用JRuby的只是對我們的解決了這一點:

我發現了一個類似的問題,但無法從它那裏得到答案: Boolean Query/Expression to a Concrete syntax tree

謝謝!

+0

@edgarespina剛纔告訴我[Parboiled](https://github.com/sirthias/parboiled/),它與Ruby的Treetop非常相似。也許這是最簡單的解決方案。 – arjones 2012-04-08 04:30:42

回答

3

鑑於您正在進行文本搜索,我會盡量利用一些由Lucene提供的基礎架構。也許你可以創建QueryParser並致電parse找回Query。查詢的實例化的子類:

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。它肯定有錯誤,但你會明白這個想法,它顯示了一個工作概念證明。它重新使用默認Lucene QueryParser的語法,文檔和語法。

3

彈簧表達式語言(SpEL)支持matches運算符,該運算符根據正則表達式返回boolean。請參閱this文檔的使用部分。

這也允許您使用邏輯運算符,如and,ornot