1

非常に柔軟な検索機能を必要とするアプリケーションがあります。この一環として、ユーザーは、多数のテキスト フィールドの全文検索を実行する機能だけでなく、定期的に (時には 1 回または 2 回以上) 更新されるデータを記録する多数の数値フィールドでフィルター処理する機能も必要になります。一分)。このデータは NDB データストアに保存されます。

現在、検索 API を使用してドキュメント オブジェクトとインデックスを作成し、テキスト データを検索しています。これらのドキュメントに数値を追加してインデックスを作成することもできます。ただし、これらの数値フィールドの動的な性質により、検索 API インデックスのドキュメントを常に更新 (削除および再作成) することになります。検索 API が古いデータを一定期間使用することを許可したとしても、1 日に数回更新する必要があります。私には、これは検索用にこのデータを保存する効率的な方法とは思えません。特に、検索クエリの数がデータの更新数よりもかなり少ないことを考えると。

検索ドキュメントを常に修正するよりも効率的で、この動的データを処理できる効果的な方法はありますか?

アイデアに関する私の唯一の考えは、全文検索の結果が NDB データストアに対するクエリで使用されるか、Python を使用して手動でフィルタリングされる 2 段階のプロセスを実装することです。どちらも理想的ではないようですが、私にはアイデアがありません。ご協力いただきありがとうございます。

4

1 に答える 1

2

確かに、Search API のドキュメントには数値データを含めることができ、簡単に更新できますが、おっしゃる通り、多くの更新を行う場合、頻繁にドキュメントを変更するのは最適ではない可能性があります。

検討できる設計の 1 つは、数値データをデータストア エンティティに格納する一方で、memcache またはバックエンドのインメモリ キャッシュのいずれかのキャッシュも頻繁に使用することです。ドキュメントとそれに関連付けられたエンティティを相互参照します (つまり、関連付けられたドキュメント ID を持つフィールドを含めるようにエンティティを設計し、関連付けられたエンティティ キーを持つフィールドを含めるようにドキュメントを設計します)。ドキュメント ID とデータストア エンティティ キー名を同じ文字列にすることができるアプリケーション ドメインの場合、これはさらに簡単です。

次に、キャッシュ内で数値フィールド情報をドキュメント ID でインデックス付けします。これにより、クエリによって取得されたドキュメントに関連する数値情報を効率的に取得できます。もちろん、データストア エンティティの更新時にキャッシュを管理する必要があります。

これは、キャッシュのサイズが法外に大きくなる必要がない限り、うまく機能します。

ドキュメント ID と関連付けられたエンティティ キー名が同じ文字列である場合、ndb のキャッシング サポートを活用して多くのことを実行できると思います。

于 2012-08-16T08:10:39.293 に答える