有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

scala如何使用布尔搜索语法进行Java字符串匹配?

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

我正在处理一个信息流,即:Twitter流,并且不能使用批处理过程,我需要实时评估每个tweet,而不是通过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

谢谢


共 (2) 个答案

  1. # 1 楼答案

    鉴于您正在进行文本搜索,我将尝试利用Lucene提供的一些基础设施。可能你可以创建一个^{}并调用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的语法、文档和语法

  2. # 2 楼答案

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

    这还允许您使用逻辑运算符,例如andornot