2

私は多くを持っています製品はelasticsearchでインデックスされています。私はelasticsearchのクエリから(私はSQLデータベースから取得している)idsのリストを除外する必要があります。がelasticsearchの結果から大量のIDを除外する方法は?

{ 
    "id" : "1", 
    "name" : "shirt", 
    "size" : "xl" 
} 

、として保存されていると仮定 製品は、我々はelasticsearchを使用して、いくつかのアルゴリズムに基づいて顧客に推奨される製品のリストを表示します。 お客様が「興味がない」と商品をマークした場合、その商品を再度表示する必要はありません。 我々はで別のSQLテーブルにこのような製品を保つためには、 'not_interested'CUSTOMER_ID状態をPRODUCT_ID。ランタイム上の顧客のための提言をフェッチ中

は今、私たちは、SQLデータベースから「not_interestedの製品のリストを取得し、勧告からそれらを除外するelasticsearchでフィルタリングしないでproduct_idsの配列を送信します。 product_ids配列のサイズが大きくなりすぎると問題が発生します。

elasticsearchにのみproduct_idとcustomer_idのマッピングを格納する必要があります 'not_interested'製品を実行時にフィルタリングするにはelasticsearchのみを使用しますか?

これらをネストされたオブジェクトまたは親/子ドキュメントとして格納することは意味がありますか?または、いくつかのIDを結果から効率的に除外できるように格納するための完全に別の方法。

答えて

1

terms queryを使用すると、ID(または他のリテラル文字列)を効率的に除外できます。

ElasticsearchとSolrの両方がこれを持っています。それは非常に強力で非常に効率的です。

弾性検索にはIDS queryがあります。このクエリは、実際には_uidフィールドの用語クエリです。 boolクエリ内のmustNot句でこのクエリを使用することを確認してください。参照:Solrのでhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html

あなたはfq=-{!terms f=id}doc334,doc125,doc777,doc321,doc253ようfqterms queryを使用することができます。それが否定であることを示すためにマイナスに注意してください。参照:

​​
+0

ネゲートされるIDのリストが巨大なリストである場合、これは問題にはなりません。そのような文書IDのうち何万ものものがあるとしましょう。 –

+0

このクエリはユースケースに合わせて最適化されているため、このサーバー側では問題ありません。私は何千ものためにこれをして、それはまだ非常に速かった!それが遅くなるのを見るには、これはあなたのインデックスサイズに依存するので、これをテストしなければなりませんが、これは非常に高い数値になります。 – drjz

+0

@drjz elasticsearchの実装については、https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.htmlに詳しく記載されています。これと同様のものをSolrにも用意できますか? docIdsが巨大な場合、_fq = - {!terms f = id} doc334、doc125、doc777、doc321、doc253_はクエリの長​​さ制限に達します。 Solrでこれを実装する方法は他にありますか?ESで行われています。 –

0

は、次のようなTermsmust_not下のセクションを追加します。

関連する問題