2012-04-07 6 views
13

나는 사용자 쿼리와 텍스트를 취할 수있는 Java/Scala 라이브러리를 찾고 있는데, 일치하는 것이 있는지 없는지를 반환합니다.부울 검색 구문을 사용하여 Java 문자열 일치를 수행하는 방법?

트위터 스트림, 일괄 처리 프로세스를 사용할 여유가없는 정보 스트림을 처리 중이므로 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 

이 루비에 구현되면 그것은 또한 내가 우리의 솔루션이 시점에 대한 JRuby를 사용할 수 없습니다, 내 플랫폼에 적합하지입니다 :

나는 비슷한 질문을 찾았지만 그것에서 답을 얻을 수 없었다 : Boolean Query/Expression to a Concrete syntax tree

감사합니다!

+0

@edgarespina가 [Parboiled] (https://github.com/sirthias/parboiled/)에 관해서 나에게 말한 것은 Treetop for Ruby와 매우 유사하게 보입니다. 어쩌면 그것이 가장 쉬운 해결책 일 것입니다. – arjones

답변

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과 같은 논리 연산자를 사용할 수도 있습니다.