10

大きくない(500 000)テーブルの11個の文字列またはテキストフィールドに対してILIKEを実行しているクエリがありますが、明らかに大きすぎるILIKEの場合、検索クエリには約20秒かかります。データベースはpostgres8.4です

この検索をより高速に実装する必要があります。

私の頭に浮かんだこと:

  1. 検索が必要なすべての列から組み立てられた追加のTVECTOR列を作成し、その上に全文索引を作成しました。全文検索は非常に高速でした。しかし...このTVECTORタイプを.hbmsにマップすることはできません。したがって、このアイデアは失敗しました(いずれにせよ、私は一時的な解決策としてそれをもっと考えました)。

  2. 休止状態の検索。(今日初めて聞いた)それは有望なようですが、もっと簡単にできることのために、おそらく最も単純なものではない新しいAPIに乗り込みたくないので、経験豊富な意見が必要です。

  3. Lucene

いずれにせよ、これはこのテーブルで今起こっていますが、私はより一般的で、全文検索に関連する将来のケースに適用されるように解決したいと思います。

すべてのアドバイスに感謝します!

ありがとう

4

6 に答える 6

12

HibernateとLuceneの間に非常に使いやすいブリッジを提供するHibernateSearchを強くお勧めします。ここで両方を使用することを忘れないでください。検索できるようにしたいドメインクラスのプロパティに注釈を付けるだけです。次に、Hibernate Searchの検索が有効になっているエンティティを更新/挿入/削除すると、関連するインデックスが更新されるだけです。これは、データベースの変更が発生するトランザクションがコミットされた場合にのみ発生します。つまり、ロールバックされた場合、インデックスは破損しません。

だからあなたの質問に答えるために:

  1. はい、特定のテーブルの特定の列にインデックスを付けることができます。また、フィールドのコンテンツをトークン化して、フィールドの一部を照合できるようにすることもできます。

  2. 使用するのは難しいことではありません。検索するプロパティを決定するだけです。インデックスを保持する場所をHibernateに指示します。次に、EntityManager / Sessionインターフェースを使用して、検索したエンティティをロードできます。

于 2011-05-25T15:14:57.320 に答える
6

すでにHibernateとLuceneを使用しているため、HibernateSearchは優れた選択肢です。

Hibernate Searchが主に提供するのは、データが変更されたときにLuceneインデックスを更新するメカニズムと、Hibernateについて既に知っていることを最大化して、Luceneインデックスに対する検索を簡素化する機能です。

インデックスを作成する各エンティティの特定のフィールドを指定したり、必要に応じて複数のタイプのインデックス(たとえば、ステムテキストやフルテキスト)を追加したりできます。また、関連付けのグラフにインデックスを付けることもできるため、Search/Luceneを介してかなり複雑なクエリを実行できます。

テキストの重い検索にはHibernateSearchに依存するのが最善であることがわかりましたが、従来の検索と結果表示のための複雑なオブジェクトグラフのハイドレイティングには、従来のHibernateに戻します。

于 2011-05-25T20:55:07.817 に答える
0

一年前、私はコンパスをお勧めしました。それはそれが何をするのかが得意であり、私が開発して維持しているアプリケーションでも技術的にはまだうまく機能しています。

ただし、ElasticSearchに切り替えた取り組みにより、Compassの開発はこれ以上ありません。そのプロジェクトのウェブサイトから、それがまだビッグタイムの準備ができているのか、それとも実際に生きているのかを完全に判断することはできません。

それで、私はHibernate Searchに切り替えます。これは、それほど良い感じはしませんが、移行はまだ初期段階にあるので、しばらくの間判断を保留します。

于 2012-02-22T16:22:03.137 に答える
0

コンパスをお勧めします。これは、Lucene上に構築されたオープンソースプロジェクトであり、(Luceneよりも)単純なAPIを提供します。これは、SpringやHibernateなどの多くの一般的なJavaライブラリおよびフレームワークとうまく統合されます。

于 2011-05-25T12:43:36.677 に答える
0

私は過去にLuceneを使用してデータベーステーブルにインデックスを付けました。このソリューションはうまく機能しますが、インデックスを維持する必要があることを忘れないでください。オブジェクトが永続化されるたびにインデックスを更新するか、Luceneインデックスにデータベーステーブルをダンプするデーモンインデクサーがあります。

Solrを検討しましたか?Luceneの上に構築されており、DBおよびRestAPIからの自動インデックス作成を提供します。

于 2011-05-25T12:45:29.083 に答える
0

すべてのプロジェクトはLuceneに基づいています。非常に高度な機能を実装したい場合は、Luceneを直接使用することをお勧めします。そうでない場合は、 Luceneに加えて強力なAPIであるSolrを使用して、DBからのインデックス作成と検索に役立てることができます。

于 2011-05-25T15:23:05.663 に答える