2016-07-05 9 views
1

との文書を検索します。データモデルにはおよそ20のフィールドがあります。これらのうち、同じものであれば、その文書が重複していると私に結論づける5つがあります。基本的には、5つのフィールドすべてで同じ値を持つドキュメントをグループ化し、集計された値だけでなく、結果の各バケットにドキュメントを戻したいと考えています。ElasticSearch:私はそれ内の文書の多くが付いてElasticSearchインデックスを有する複数の同一フィールド

これを行うElasticSearchことができますか?だから、短い答えはイエスである、elasticsearchは間違いなくこれを行うことができます

答えて

1

、以下の短い例で見ることができる方法:

{ 
    "filtered": { 
    "query": { 
    // Your query goes here 
    } 
    }, 
    "filter": { 
    "script": { 
     "script": "doc['field1'].value == doc['field2'].value == doc['field3'].value == doc['field4'].value" 
    } 
    } 
} 
} 

私は唯一の2つのフィールドでこれを試してみたが、私はそれが動作するはずだと思いますそれ以上にも。

あなたは基本的に、これらのフィールドは、すべて等しくない文書を削除するには、フィルタを使用しています。うまくいけば、これは役に立ちます。

場合、あなたはdocumentBとドクメンタと一致し、それぞれの分野の5は別の問題であろうと同じかどうかを確認したいです。

この問題を解決するには、一度に1つのドキュメントを取得し、探しているフィールドにelasticsearchクエリフィルタリングを実行し、他のドキュメントが表示されるかどうかを確認するスクリプトを作成することをお勧めします。もしそうなら、それらを取り除き、プロセスを繰り返す。一致するものがない場合は、次の文書に移動します。チェックする文書がなくなると、完了です。 (完了した時点を追跡するためにドキュメントカウンターやドキュメント名のリストを保持したい場合があります)

これはおそらく、あなたが探していたきれいな弾性検索アプローチではないかもしれませんが、もっと良い方法があるかもしれません。あなたの問題を解決する1つの方法。

+0

はこの欠点があるため、あなたがスクリプトをやっているということでしょう説明したようにバケット使用上の内側に完全なドキュメントを取得するには最初の例ではhere

を見ていると、CPU集約型であることがその可能性が高く、凝集をヒットあなたはこれを常に実行し続けたくないかもしれません。 –

+0

ちょっとしたVishal、あなたの助けに感謝します。これは私が興味を持ったことに対処します。同じ文書内のフィールドに重複した値がないかチェックします。しかし、この場合、別のドキュメントの同じフィールドに重複した値がないかどうかを確認する必要があります。たとえば、Doc AにDoc Bと同じFirstName、LastName、Birthday、ZIP Codeがある場合は、重複します。 – SuperNES

+0

私の答えを編集しました。うまくいけば助かります。 –

1

次の手順を使用してみてください。

  1. すべてのフィールドの用語集合を使用して、すべてのフィールドのすべての異なる値を除外します。
  2. あなたは、少なくとも5つのフィールドが返される文書について、その値を持つ必要があります見ることができるように、それぞれの値が使用してクエリが5

  • すべてのフィールドに設定min_should_matchパラメータを照会する必要があります。 here

    関連する問題