2012-04-07 32 views
13

Tôi đang tìm thư viện Java/Scala có thể lấy truy vấn người dùng và văn bản và trả về nếu có kết hợp hay không.Cách thực hiện khớp chuỗi Java bằng cách sử dụng Cú pháp tìm kiếm Boolean?

Tôi đang xử lý luồng thông tin, ví dụ: Twitter Stream và không thể sử dụng quy trình theo đợt, tôi cần đánh giá từng tweet trong thời gian thực, thay vì chỉ mục qua Lucene RAMDisk và truy vấn nó sau.

Có thể tạo trình phân tích cú pháp/lexer bằng cách sử dụng ANTLR nhưng đây là cách sử dụng phổ biến như vậy mà tôi không thể tin rằng không ai tạo ra lib trước đây.

Một số mẫu từ TextQuery Ruby library thực hiện chính xác những gì tôi cần:

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 

Một khi nó đã được thực hiện trong Ruby đó là không phù hợp với nền tảng của tôi, tôi cũng không thể sử dụng JRuby chỉ dành riêng cho thời điểm này trên giải pháp của chúng tôi:

tôi tìm thấy một câu hỏi tương tự nhưng không thể có được câu trả lời từ nó: Boolean Query/Expression to a Concrete syntax tree

Cảm ơn!

+0

@edgarespina chỉ nói với tôi về [Parboiled] (https://github.com/sirthias/parboiled/) có vẻ rất giống với Treetop cho Ruby. Có lẽ đó là giải pháp dễ nhất. – arjones

Trả lời

3

Vì bạn đang thực hiện tìm kiếm văn bản, tôi sẽ cố gắng tận dụng một số cơ sở hạ tầng do Lucene cung cấp. Có thể bạn có thể tạo một số QueryParser và gọi parse để lấy lại Query. lớp con Instantiable của Query là:

TermQuery 
MultiTermQuery 
BooleanQuery 
WildcardQuery 
PhraseQuery 
PrefixQuery 
MultiPhraseQuery 
FuzzyQuery 
TermRangeQuery 
NumericRangeQuery 
SpanQuery 

Sau đó, bạn có thể sử dụng mô hình kết hợp để thực hiện những gì một trận đấu có nghĩa là cho ứng dụng của bạn:

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) 

Đây là an implementation. Nó chắc chắn có lỗi nhưng bạn sẽ nhận được ý tưởng và nó cho thấy một bằng chứng làm việc của khái niệm. Nó tái sử dụng cú pháp, tài liệu và ngữ pháp của Lucene QueryParser mặc định.

3

Ngôn ngữ biểu thức mùa xuân (SpEL) hỗ trợ toán tử matches trả về boolean s dựa trên cụm từ thông dụng. Xem phần this của tài liệu để sử dụng.

Điều này cũng sẽ cho phép bạn sử dụng toán tử logic như and, ornot.

Các vấn đề liên quan