java - 如何使用 boolean 搜索语法进行 Java 字符串匹配?

标签 java scala textmatching booleanquery

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

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

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

一些样本来自 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

谢谢!

最佳答案

鉴于您正在进行文本搜索,我会尝试利用 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)

这里是 an implementation .它肯定有错误,但你会明白这个想法,它展示了一个有效的概念证明。它重新使用默认 Lucene QueryParser 的语法、文档和语法。

关于java - 如何使用 boolean 搜索语法进行 Java 字符串匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10055909/

相关文章:

java - 我可以从 Action 监听器内部在类中设置数组吗? java

uri - 如何匹配文本中的 URI?

java - 从 JSP 页面中的 Java.class 列表中检索值

java - Apache Commons Email - 在线程中发送电子邮件

c# - Scala有没有类似于C#的显式接口(interface)实现?

exception - 如何找到 "ignored"的异常?

java - 在 Java 中将文本文件表示为单个单元,并匹配文本中的字符串

java - 从另一个 Controller JavaFx调用方法

java - Spring MVC + JAXB : ServletException: Unable to locate object to be marshalled in model

java - log4j级别配置TRACE和ALL