14

ユーザークエリとテキストを受け取り、一致するかどうかを返す Java/Scala ライブラリを探しています。

Twitter ストリームなどの情報ストリームを処理していますが、バッチ処理を使用する余裕はありません。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

テキスト検索を行っていることを考えると、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 に答える
3

Spring Expression Language (SpEL)は、正規表現に基づいて s をmatches返す演算子をサポートしています。使用方法については、ドキュメントのこのセクションをboolean参照してください。

andこれにより、 、 、orなどの論理演算子を使用することもできますnot

于 2012-04-07T16:22:06.520 に答える