7

検索クエリを解析し、DB の SQL クエリに変換する簡単な方法を見つけようとしています。

私は2つの解決策を見つけました:

  1. Lucene : 強力な Java ベースの検索エンジンで、クエリ パーサーが含まれていますが、構成があまり難しくなく、SQL クエリを作成するために簡単にハッキング/適応させる方法を見つけることができました。
  2. ANTLR : ベテランのテキスト レクサー パーサー。コンパイラからスカイスクレーパーまで、あらゆるものを構築するために使用されます。ANTLR は高度な設定が可能ですが、これからコードに触れるすべての人は新しい言語を学ぶ必要があります...

他のアイデアはありますか?

4

7 に答える 7

3

SQL-ORMは非常に軽量なJavaライブラリであり、オブジェクトのグラフとしてJavaで(動的な)SQLクエリを作成する機能が含まれています。

私見ですが、これは通常の文字列連結方法よりも動的SQLクエリを構築するためのはるかに優れた手法です。

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

于 2008-09-30T20:09:50.023 に答える
1

正確には何を念頭に置いていますか?私はテキスト検索に Lucene を使用しましたが、それが優れているのは、データベースにまったくアクセスする代わりに、インデックスを作成して検索することです。

私は最近、(スペースで区切られた) すべての列を 1 つのフィールドに連結し、それを Lucene にポップし、別の列に主キーを追加することによって、Lucene でテーブルにインデックスを付けるシステムをセットアップしました。Lucene がすべての検索を実行し、主キーのリストを返しました。これを使用して、入力済みの一連の結果をプルアップし、ユーザーに表示しました。

検索クエリを SQL ステートメントに変換するのは、少し面倒に思えます。

また、Lucene の基本構造を説明する優れた入門チュートリアルもあります。

于 2008-08-17T19:30:37.063 に答える
1

javacc (Java Compiler Compiler)などを使用してパーサーを実装するか、総当たりで文字列を手動で解析することができます。式に出くわすたびに、それをオブジェクトとして表現します。次に、式ツリーを where 句に変換するだけです。

例: 「ハリー・ポッター」は次のようになります。

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

また、「publisher:Nature* pages > 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 式は、必要なだけネストできます。

于 2008-09-30T19:43:55.280 に答える
0

ORM ツール (openJPA など) と Compass (OSEM のフレームワーク) を組み合わせてみてください。ORM ツールを介して行われた更新を自動的にインデックス化し、Lucene の検索機能を提供します。その後、もちろんDBからオブジェクトを取得できます。これは、SQL ベースの検索ソリューションよりも優れています。

于 2009-08-18T17:50:11.917 に答える
0

解析する必要のあるクエリの種類と、データベース内のデータの構造に大きく依存します。ほとんどの情報検索関係者が言うように、DB 内で全文検索 (つまり、DB 全体にわたる検索エンジン) を実行しようとしていないと仮定しますが、そのパフォーマンスはひどいものです。逆インデックスは、間違いなくそれを行うための最良の方法です。

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

于 2008-08-17T19:28:04.760 に答える
0

私が全文検索を探しているわけではないと仮定するのは正しいです。この情報は、書籍情報のスキーマのようなものです: Name: string, publisher:string, num_pages int, publish_date:date...

検索クエリは次のようなものです。

  1. ハリー・ポッター(名前にハリーとポッターの両方が含まれる本を検索)
  2. publisher:Nature* pages>100 (Nature で始まる出版社の本で 100 冊以上の本)
  3. (「新年」またはクリスマス)とプレゼント(写真を手に入れます...)
  4. 物理学および公開 > 1/1/2008 (新しい物理学の本)
于 2008-08-17T19:37:41.620 に答える