2008-08-17 14 views
5

検索クエリを解析し、それを自分のDBのSQLクエリに変換する簡単な方法を探しています。Javaで検索クエリを解析する

私は2つの解決策を発見した:、強力なJavaベースの検索エンジンのクエリパーサーが含まれていますが、それは非常に設定できませんし、私は簡単にそれを適応させる/ハックする方法を見つけることができます:

  1. LuceneをSQLクエリを作成します。
  2. ANTLR:ベテランのテキストレクサーパーサーです。コンパイラからスカイスクレイパーまで何かを構築するために使用されます。 ANTLRは高度に構成可能ですが、今からコードに触れる人は誰でも新しい言語を学ばなければなりません...

他のアイデアをお持ちですか?

答えて

0

あなたが解析しなければならない種類のクエリと、データベースのデータ構造に多少依存します。ほとんどの情報検索ユーザーがあなたに語るように、DBのフルテキスト検索(DB全体の検索エンジン)を実行しようとしていないと仮定します。そのためのパフォーマンスはひどいです。反転したインデックスが最も確実な方法です。

実際の問題について、ユーザーが入力するもの、出力として期待するもの、データモデルのようなものについてもう少し詳しく教えてください。これらの情報を持たない検索ソリューションを設計すれば、最適な結果を得ることができます。

1

あなたは何を覚えていますか?私はLuceneをテキスト検索に使用しましたが、インデックスを構築しての代わりにのデータベースを検索しています。

私は最近Luceneのテーブルにインデックスを作成します。ここでは、すべての列を1つのフィールドに連結し、そのフィールドをLuceneにポップし、プライマリキーを別の列に追加します。 Luceneはすべての検索を行い、主キーのリストを返しました。これを使用して、人口統計データセットをプルアップしてユーザーに表示していました。

検索クエリをSQL文に変換すると、少し混乱しているように見えます。

また、a great beginning tutorial explaining the basic structure of Luceneです。

0

あなたは、全文検索を探していないと仮定することは間違いありません。

  1. ハリー:

    検索クエリ

    がソートである...日付: 名:文字列、出版社:文字列、NUM_PAGES int型、公開日 情報は、本書の情報のためのスキーマのようになりますポッター
    は(名前はハリー・ポッターとの両方を持っているwhosはどんな本を検索)
  2. 出版社:自然*(以上100冊で自然で始まる出版社からの冊)ページ> 100
  3. ( "新年"またはクリスマス)とプレゼント(あなたは写真を手に入れます...)
  4. 物理学と> 2008年1月1日(新物理学の本を出版)
1

あなたはパーサを実装するか、他単に手動で文字列を解析するためにjavacc(Javaコンパイラコンパイラ)のようなものを使用して試みることができます強引な。表現を見つけ出すたびに、それをオブジェクトとして表現します。次に、式ツリーをwhere句に変換するだけです。例えば

: "ハリー・ポッター"

new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter") 

になり、 "出版社:自然*ページ> 100は、" あなたはこれらを持っていたら、それはそれらを回すために非常に簡単です、そして、

new AndExp(new FieldContainsExp("PUBLISHER", "Nature"), FieldGreaterThan("PAGES", 100)) 

なりSQLへ:

FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    sql.append(fieldName); 
    sql.append(" like "); 
    sql.append("'%?%'"); 
    args.add(value); 
} 

AndExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    exp1.toSQL(sql, args); 
    sql.append(" AND "); 
    exp2.toSQL(sql, args); 
} 

あなたは残りの部分を想像することができます。あなたはAndの表現をあなたが望む深みで入れ子にすることができます。

3

SQL-ORMは、オブジェクト

IMHOのグラフとしてJavaで(動的)SQLクエリを構築する能力を備えて非常に軽量なJavaライブラリで、これは通常よりも、動的SQLクエリを構築するためのはるかに優れた技術であります文字列連結法。

免責事項:私はこのプロジェクトにいくつかの非常にマイナーな貢献をした

+0

非常に興味深い。 IBatisのように見えます。 –

0

は(OpenJPAのような)ORMツールを組み合わせて、コンパス(OSEMのためのフレームワーク)にしてください。 ORMツールを使用して行われた更新を自動的に索引付けし、Luceneの検索エンジンを提供します。その後、あなたはもちろん、DBからオブジェクトを取得することができます。 これは、SQLベースの検索ソリューションをすべて凌駕します。

-2

String [] array;

int checkWord(String searchWord) 
{ 
    for(int i = 0; i < array.length; i++) 
    { 
     if(searchWord.equals(array[i])) 
      return i; 
    } 
    return 0; 

} 
+0

これは本当に質問に答えません。 –