14

我正在寻找一个 Java/Scala 库,它可以接受用户查询和文本并返回是否匹配。

我正在处理信息流,即:Twitter Stream,并且无法使用批处理过程,我需要实时评估每条推文,而不是通过 Lucene RAMDisk 对其进行索引并稍后查询。

可以使用ANTLR创建解析器/词法分析器,但这是一种常见的用法,我不敢相信以前没有人创建过库。

TextQuery Ruby 库中的一些示例完全符合我的需要:

    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

谢谢!

4

2 回答 2

3

Spring 表达式语言(SpEL)支持基于正则表达式matches返回 s 的运算符。boolean有关用法,请参阅文档的部分。

这也将允许您使用逻辑运算符,例如and,ornot

于 2012-04-07T16:22:06.520 回答
3

鉴于您正在进行文本搜索,我会尝试利用 Lucene 提供的一些基础设施。可能您可以创建一个QueryParser并调用parse以取回一个Query. 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)

这是一个实现。它肯定有错误,但你会明白的,它显示了概念的工作证明。它重用了默认 Lucene QueryParser 的语法、文档和语法。

于 2012-04-08T01:04:36.533 回答