問題タブ [elasticsearch-dsl-py]
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.
django - Django Celery タスクでの Elasticsearch インデックス作成
ドキュメントとそれに関連するメタデータを保存する Django Web アプリケーションを構築しています。
メタデータの大部分は基盤となる MySQL データベースに保存され、OCR されたドキュメント テキストは Elasticsearch でインデックス化され、全文検索が可能になります。モデルで見つかった他のいくつかのフィールドにもインデックスを付けている (したがって、二重に格納している) ため、データ モデルを接続して同期するためにdjango-elasticsearch-dslを組み込みました。Haystackの使用を検討していましたが、Elasticsearch の最新バージョンをサポートしていません。
ドキュメントがアプリケーションの管理インターフェイスを介してアップロードされると、post_save シグナルが自動的に Celery 非同期バックグラウンド タスクをトリガーしてOCR を実行し、最終的に抽出されたテキストを Elasticsearch にインデックス付けします。
モデルに全文フィールドが定義されていないことを見て (データベースに CLOB を保存したり検索したりしたくないので、そうしないことを望んでいます)、更新のベスト プラクティスを探しています。私のtasks.pyファイルからの私のElasticsearchドキュメント。django-elasticseach-dsl を使用してそうする方法はないようです (しかし、おそらく私が間違っているのでしょうか?)。
姉妹のdjango-elasticsearch-dsl-drfパッケージを使用して、REST 経由で Elasticsearch とのインターフェースを試みます。
よりバニラのelasticsearch-dsl-pyパッケージ(elasticsearch-pyに基づく)を使用して、アプリケーションをElasticsearchとより大まかに統合します。少なくともモデルに信号を接続したい場合は、もう少し統合コードを書かなければならないので、このアプローチではいくらか「贅沢」を失うでしょう。
ベストプラクティスはありますか? または、私が検討していない別のアプローチですか?
更新 1: @Nielk からの回答を実装しようとすると、OCR されたテキスト (result = "test" in tasks.py below) を ElasticSearch に永続化できますが、MySQL データベースにも永続化されます。基本的に Submission.rawtext を ElasticSearch へのパススルーとして構成する方法について、私はまだ混乱しています。
models.py:
ドキュメント.py:
tasks.py (サブミッション モデルの post_save シグナルで呼び出されます):
更新 2 (実用的なソリューション):
models.py クラスの提出 (models.Model):
ドキュメント.py
タスク.py
python - Pythonを使用したエラスティック検索でのオートコンプリート
次のクエリを使用して、kibana でヒットを返すインデックス company_prod2 があります。
しかし、次のコードでPython Elastic Search DSLライブラリを使用して検索しようとすると:
結果が得られません。ネイティブのpythonライブラリを使用してみました:
しかし、これも 0 ヒットになります。
以下のコマンドを使用してcurlを試してみると:
私は喜んで結果を得ます。エラスティック検索で同じクエリを実行するには、Python ライブラリを使用する必要があります。
python-3.x - GeoPoint を含む場所のリスト - (geo_spatial_filter_fields, geo_distance)
私はelasticsearch-dsl-drfを使用してlocation
おり、ドキュメントの単一のフィールドを次のNestedField
定義の に変換しました:
location = fields.NestedField(properties={"point": fields.GeoPointField()})
次に、私の見解では(値を追加path
および変更して、機能field
させようとしました):
どうすればこれを達成できるのだろうか?各文書の場所のリストから、最も近い場所に基づいてすべての文書を並べ替えたいと考えています。
編集
現在実験中(これを使用するようにelasticsearch dsl drfを変更):
これは実行されるようですが、ソートはオフです。
お時間をいただきありがとうございます。
elasticsearch-dsl-drf のソリューション
python - Elasticsearch-dsl を使用して Django で並列テストを行うにはどうすればよいですか?
Elasticsearch を使用して Django で並列テストを実行した人はいますか? もしそうなら、それを実現するために必要な構成変更を共有できますか?
here で説明されているソリューションを含め、機能させるために考えられるすべてのことを試しました。Django 自体が並列 DB を行う方法からインスピレーションを得て、現在ParallelTestSuite
、init_worker をオーバーライドして各インデックス/ドキュメントタイプを反復処理し、インデックス名を次のように大まかに変更するカスタム new を作成しました。
これは通常はうまくいくように見えますが、一見ランダムに発生する奇妙な点があります (つまり、テスト スイートを再度実行しても問題が確実に再現されないか、エラー メッセージが変化します)。以下は、私が得たさまざまなエラーであり、テストの実行ごとにそのうちの 1 つでランダムに失敗するようです。
- 上記の関数でインデックスを作成しようとすると 404 が発生します (404 が PUT 要求から返されることを確認しましたが、Elasticsearch サーバー ログでは、問題なくインデックスが作成されたことが示されています)。
- インデックスを作成しようとすると 500 になりますが、これはしばらく発生していないため、他の方法で修正されたと思います
- クエリ応答には、elasticsearch ライブラリ
items
の関数内に辞書値がない場合があります。_process_bulk_chunk
接続レイヤーで何か奇妙なことが起こっていると考えています (Django テスト ランナー プロセス間の接続が応答を混同しているように) が、Django がmultiprocessing を使用してテストを並列化するため、テストはそれぞれ独自のプロセスで実行されます。スピンオフされたプロセスがまだ元のプロセスの接続プールなどを使用しようとしている可能性はありますか? 私は本当にここから他に試してみることができず、いくつかのヒントや、これが実際に可能であることの確認さえもいただければ幸いです。