問題タブ [compass-lucene]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
303 参照

java - Apache LuceneベースのDAO?

バックエンドのRESTfulWebサービスを使用してWebアプリケーションを構築しています。

私のテーブルの1つはほとんどスタンドアロンです。つまり、行は他の1つのテーブルからのみ参照され、結合なしで幸せに生きることができ、必要な場合にのみ主キーでフェッチできます。ただし、このテーブルには多くの行が含まれており、このテーブルに対して実行された検索はすべて「Lucene」と叫びます。MySQLは、妥当な応答時間でこれらのクエリを処理できません。

したがって、このテーブルの検索にはLuceneを使用したいと思います。過去に私はSolrを幅広く使用したことがあるので、概念と用語に精通しています。上記の状況を考えると、SQLからLuceneへのインデックス同期の代わりに、この特定のエンティティの正規ストレージとしてLuceneを単純に使用するべきではない理由がわかりません。基本的に、この特定のテーブルの現在のHibernateDAO実装を置き換える「LuceneDAO」実装が必要です。

だから私の質問は:

  1. それを避けてSQLからインデックスへの同期に固執する必要がある理由はありますか?
  2. 「LuceneDAO」が実行可能なアプローチである場合、そのようなものの基盤を提供するライブラリはありますか?検索しようとしましたが、見つかりませんでした。
  3. 私はHibernateSearchに出くわしました。それは私が探しているものの半分しか実行しませんが、検索にのみ使用することができます。Hibernate Searchを使用した経験のある人はいますか?

編集:私は今、一見私が探しているもののように見えるコンパスに出くわしました。誰かがそれを使った経験がありますか?


編集#2:Compassは廃止され、まったく同じではないElasticSearchに置き換えられました(コンポーネントではなくサービス)。Hibernate Searchも、私が探しているものではありませんでした。肝心なのは、これは有効なアプローチですが、当面はそのようなDAOを自分で実装する必要があります。

0 投票する
1 に答える
419 参照

grails - JDBC ストアの共有 Compass/Lucene インデックス

Grails の検索可能プラグイン (内部では Compass/Lucene を使用) を使用して、2 つの異なる Web アプリケーション間で検索インデックスを共有しようとしています。1 つのアプリケーションは、読み取り専用の方法でのみデータにアクセスします。もう一方のアプリケーションは、データの変更を許可し、変更に応じてインデックスを更新するか、必要に応じて完全な再インデックスを実行します。

インデックスを保存するために、JDBC ストアを使用しています (両方のアプリケーションが同じ DB を指しています) http://www.compass-project.org/docs/latest/reference/html/core-connection.html

残念ながら、一方のアプリケーションでインデックス全体を再構築するとすぐに、もう一方のアプリケーションには無効なデータがキャッシュされているように見え、検索が実行されると例外がスローされます。

クリーンアップを実行できるように、あるアプリケーションから別のアプリケーションにインデックスが再構築されるという事実を伝えることができます。

  • Grails と Searchable プラグインで同様の問題が発生した人はいますか?
  • Compass/Lucene でキャッシュされたデータを破棄することはできますか?
  • 一般的にキャッシュを無効にすることは可能ですか?
0 投票する
2 に答える
2714 参照

java - 検索時に分音符号を無視する

Compass/Lucene を使用して、データベースの検索とインデックス作成を行っています。クエリ「foo」が「Fóo」と「foo」の両方に一致し、「fóó」のクエリが「fóo」と「fOO」に一致するように、検索時に分音記号と文字の大文字と小文字を区別しないようにします。

私が読んだ内容に基づいて、コンパスがコンテキストのインデックス作成と検索の両方で使用するデフォルトのアナライザーを変更する必要があるようです。使用するアナライザーを指定する場所はわかりましたが、要件を満たすアナライザーの実装が見つからないようです。分音記号と大文字小文字を無視するアナライザーは既に存在しますか?それとも独自に作成する必要がありますか?

0 投票する
1 に答える
224 参照

java - compass-lucene での列挙型のインデックス作成

DTO オブジェクトからデータをフィルター処理するために Compass を使用しています。@SearchableComponentPOJO オブジェクトの場合は 、文字列の場合は でフィールドをマークしますSearchableProperty。それは完全に機能します。オブジェクトと文字列のインデックスを取得します。

私の質問は、ENUM データ型にどのように注釈を付けるかです。

私が持っている列挙型の例:

このスニペットのどこに注釈を入れるべきか、どの注釈を入れるべきか?

0 投票する
1 に答える
365 参照

java - 日付を使用したCompassLuceneクエリからの空の結果セット

Compassを使用して、メモリデータ構造内のデータに対してクエリを実行しています。文字列と列挙型の値の検索には問題なく機能します。日付を検索したいと思います。

検索条件には注釈が付けられ@SearchRestrictionます。someDateに関する例:

検索可能なデータで、SomeDateは次のように注釈が付けられます。

SomeDate検索可能なデータの内部はnew Date();)で生成され、クエリ文字列は。として指定され20120802ます。

デバッガーの状況: このコードは、次のようなクエリを生成します。

これが私someDateが探しているフィールドの名前であり、20120802yyyyMMddの順序の日付です。

問題: このクエリを実行すると、結果が返されません。空のリストが表示されます。クエリの日付は、日付オブジェクトの日付と同じです。

なにが問題ですか??Dateコンパスでs を検索するこれは間違った方法ですか?日付に関する範囲クエリしか見つかりませんが、正確な日付または正確な日付の一部を使用した検索は見つかりません。

0 投票する
1 に答える
710 参照

java - Lucene と Compass の使用に関する有用な情報はどこにありますか?

私は Lucene と Compass を学んでおり (Compass は、私が取り組んでいるコードが古いためです)、どこから始めるべきか (そして何を読み始めるべきか) を見つけようとしています。Lucene in Action は古すぎて、コードも実行されないため、役に立ちません。また、Compass を使用する場合、Lucene についてよく読む必要があるかどうかもわかりません。

また、Compass に関する適切なテキストはどこにありますか? ドキュメンテーションはかなり技術的で、Lucene に関する知識が必要でした。

0 投票する
1 に答える
81 参照

java - @SearchableComponent とプレフィックス

Compass (レガシー コード) に関するドキュメントを読んでいますが、@SearchableComponent と prefix 属性がわかりません。ドキュメンテーションを参照せずに、誰かが自分の言葉で説明しようとすることはできますか?

0 投票する
1 に答える
1882 参照

grails - 検索可能なインデックスが手動更新でロックされる (LockObtainFailedException)

ロードバランサーの背後で実行される Grails プロジェクトがあります。サーバー上で実行されている Grails アプリケーションの 3 つのインスタンスがあります (個別の Tomcat インスタンスを使用)。各インスタンスには、独自の検索可能なインデックスがあります。インデックスは個別であるため、アプリケーション インスタンス間でインデックスの一貫性を維持するには、自動更新だけでは十分ではありません。このため、検索可能なインデックスのミラーリングを無効にし、インデックスの更新はスケジュールされた Quartz ジョブで手動で行われます。私たちの理解によれば、アプリケーションの他の部分はインデックスを変更すべきではありません。

Quartz ジョブは 1 分に 1 回実行され、アプリケーションによって更新された行をデータベースからチェックし、それらのオブジェクトのインデックスを再作成します。ジョブは、同じジョブが既に実行されているかどうかも確認するため、同時インデックス作成は行われません。アプリケーションは起動後数時間は問題なく動作しますが、ジョブの開始時に突然 LockObtainFailedException がスローされます。

22.10.2012 11:20:40 [xxxx.ReindexJob] エラー検索可能なインデックスを更新できませんでした、クラス org.compass.core.engine.SearchEngineException: サブ インデックス [製品] のライターを開けませんでした。ネストされた例外は org.apache.lucene.store.LockObtainFailedException: ロック取得がタイムアウトしました: SimpleFSLock@/home/xxx/tomcat/searchable-index/index/product/lucene-a7bbc72a49512284f5ac54f5d7d32849-write.lock

前回のジョブ実行時のログによると、再インデックスはエラーなく実行され、ジョブは正常に終了しました。それでも、前回の操作が未完了でロックが解除されていないかのように、今回は再インデックス操作によってロック例外がスローされます。アプリケーションを再起動するまでロックは解除されません。

ロックされたインデックスを手動で開くことで問題を解決しようとしましたが、これにより次のエラーがログに出力されました。

22.10.2012 11:21:30 [manager.IndexWritersManager] エラー 不正な状態です。インデックス ライターを開いているとマークしていますが、別のライターはサブ インデックス [製品] に対して開いているとマークされています

この後、ジョブは正しく機能しているように見え、再びロック状態でスタックすることはありません。ただし、これにより、アプリケーションは常に CPU リソースの 100% を使用します。以下はクォーツジョブコードの短縮版です。

問題を解決するための助けをいただければ幸いです。事前に感謝します。

JMX CPU サンプルに基づくと、Compass は舞台裏で何らかのスケジューリングを行っているようです。1 分間の CPU サンプルから、通常のインスタンスと 100% の CPU インスタンスを比較すると、いくつかの違いがあるように見えます。

  • org.apache.lucene.index.IndexWriter.doWait() がほとんどの CPU 時間を使用しています。
  • Compass Scheduled Executor スレッドがスレッド リストに表示されますが、これは通常の状況では見られませんでした。
  • 1 つの Compass Executor スレッドが commitMerge を実行していますが、通常の状況では、これらのスレッドのいずれも commitMerge を実行していません。
0 投票する
0 に答える
364 参照

lucene - クラスター環境でのコンパス/Lucene

一方のノードがオブジェクトのインデックスを作成していて、もう一方のノードがキャッシュにあるセグメントについて混乱しているクラスター環境で、次のエラーが発生します。サーバーを再起動した後でも、ノードが自動的に回復することはありません。インデックスを作成しているノードは、他のノードが認識していないセグメントをマージして削除している可能性があります。invalidateCacheInterval設定には触れず、500msでcompass.engine.globalCacheIntervalInvalidationプロパティを追加しました。それは役に立たなかった。

これは、他のノードでの検索とインデックス作成中に発生しています。

誰かがこの問題を解決する方法を教えてもらえますか?たぶん、コンパスにキャッシュをリロードするように依頼するか、すべてのオブジェクトのインデックスを再作成せずに最初からやり直すように依頼しますか?

org.compass.core.engine.SearchEngineException:クエリ[+ type:...)]で検索に失敗しました; ネストされた例外はorg.apache.lucene.store.jdbc.JdbcStoreExceptionです:[_ 6ge.tis]テーブルindex_objectsのエントリがありませんorg.apache.lucene.store.jdbc.JdbcStoreException:orgの[_6ge.tis]テーブルindex_objectsのエントリがありません。 apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput $ 1.execute(FetchOnBufferReadJdbcIndexInput.java:68)at org.apache.lucene.store.jdbc.support.JdbcTemplate.executeSelect(JdbcTemplate.java:112)at org.apache.lucene .store.jdbc.index.FetchOnBufferReadJdbcIndexInput.refill(FetchOnBufferReadJdbcIndexInput.java:58)at org.apache.lucene.store.ConfigurableBufferedIndexInput.readByte(ConfigurableBufferedIndexInput.java:27)at org.apache.lucene.store.IndexInput.readVInt(IndexInput .java:78)org.apacheで。

0 投票する
1 に答える
1241 参照

spring - persistence.xml ではなく、Spring Bean の hibernate.search.default.directory_provider


私はかなり厄介な状況にあります。Lucene との Hibernate 検索統合にコンパスを使用し、FSDirectoryProvider、RAMDirectoryProvider などの代わりに( JdbcDirectoryを使用して) データベース ディレクトリ検索を実装しました。

問題は、以下のようにディレクトリ プロバイダーが META-INF/persistence.xml 内のプロパティとして渡されることです。

JdbcDirectory にはデータソースを渡す必要があるため、データベースの詳細を JdbcDirectoryProvider に渡す必要があります。

データベースとインデックスの詳細を含むプロパティ ファイル (クラス パス内) を使用して、型にはまらない方法で (ディレクトリ プロバイダー用の) データソースを構築しています。

uk.company.JdbcDirectoryProviderをSpring Bean として構成した場合、データソースを注入できます。これは Tomcat ではうまく機能しますが、persistence.xml で directory_provider を渡しているため、OAS や Weblogic ではうまく機能しません。おそらく、データソースが春によって初期化されるためです(これらのアプリサーバーでクラスローダーが機能する方法のため)。

私の質問は、persistence.xml の代わりに aSpring Bean 内でhibernate.search.default.directory_providerを直接構成するにはどうすればよいですか?

最寄りの場所は次のとおりです。

ただし、次の 3 つのプロパティのみが必要です。

解決

Spring Bean の休止状態のプロパティをjpaPropertiesとして渡すことができます