2017-10-06 11 views
0

タイプが日付で、それぞれのタイプに複数の文書があるインデックス構造があります。私はすべての文書をタイプ1に入れる必要がありますが、タイプ2には存在しない必要があります。例として:タイプ1に一致する文書を取得し、タイプ2に一致しない文書を取得する

Type-1 ---> id list = [1,2,3,4,5,6] 
Type-2 ---> id list = [2,3,7,8,9] 

私が探しているクエリは、私は上記のためにES-pyのクライアントを使用している唯一のid = [1,4,5,6] で1型からドキュメントを返す必要があります目的。

PS:タイプ1とタイプ2にそれぞれ一致するドキュメントを個別に取得してから、両方を繰り返して必要なものを取得できます。しかし、これはパフォーマンスのために避けたい解決策です。

答えて

1

私の最初の考えは、あなたの質問は、2種類のドキュメントセットの差(差し引き)に関することです。しかし、あなたが述べたように、あなたは、2つのタイプで同じ文書を持つことはできませんが、2つの文書(_uid = _type#_id)

で同じIDだからあなたの質問を約join-Queryです: あなたはまた、1型のすべての_id値の補数を必要としますタイプ2に属します。

これにはParent-Child-Relationshipを使用できますが、この場合はインデックスプロセスを変更する必要があります。

残念ながら、elasticsearchの2つのタイプの間に他の「組み込み」結合がありません(たとえば、solrが役に立ちます)。

アグリゲーションによる結合からすべてのIDを取得し、elasticsearchなしで補集合を構築できますが、これはタイプ-1の小さなセットに対してのみ機能します。 https://github.com/elastic/elasticsearch/blob/v5.6.2/modules/parent-join/src/main/java/org/elasticsearch/join/query/HasParentQueryBuilder.java

しかし、注意してください:

だから、私の視点から、あなたが出発点ParentJoinPlugin

に独自の検索プラグインのアナログを構築する必要は次のようになり、タイプ1の文書がに属している場合他のシャード、次にタイプ2、あなた自身のSearchPluginでも参加することはできません。

+0

これは要件を解決するものではありません。あなたのクエリーはType-1を持っているがType-2を持っていないすべての文書を与えます(これはType-1のすべての文書を与えるのと同じです)。両方の型で同じ_idが見つかった場合は、応答の一部として返されるべきではありません(ただし、クエリに応じて返されます)。 –

+0

OKです.1つのドキュメントは2種類ありません。だから私は私の答えを変えます。 –

関連する問題