2016-12-10 6 views
0

私は、ディスカッションにメッセージを表すドキュメントを含むインデックスを持っているとします。
そのドキュメントはdiscussionIdプロパティを所有しています。 (メッセージIDを表す独自のIDも持っています)

今、質問に一致する文書(メッセージ)がないすべてのdiscussionIdを見つける必要があります。例えば

他のドキュメントのクエリによるオブジェクトの弾性検索集計

私はそれをどのように行うことができます

「テキスト 『YO YO』を含む一切のメッセージを持っていないすべてのdiscussionIdsを、検索」?

クラスには、次のようになります。

public class Message 
    { 
    public string Id{get;set} 
    public string DiscussionId {get;set} 
    public string Text{get;set} 
    } 
+0

議論は多くのメッセージの論理的なグループである使用することができます。 challengeangeは特定のメッセージを含まないdiscussionIDのリストを見つけることです。 –

答えて

1

あなただけbool query must_not clausematches for the phrase「YO YO」を見つけるだろうクエリをラップする必要があります。 NESTで

operator overloadingで、

client.Search<Message>(s => s 
    .Query(q => !q 
     .MatchPhrase(m => m 
      .Field(f => f.Text) 
      .Query("YO YO") 
     ) 
    ) 
); 

両方に短縮することができ、

client.Search<Message>(s => s 
    .Query(q => q 
     .Bool(b => b 
      .MustNot(mn => mn 
       .MatchPhrase(m => m 
        .Field(f => f.Text) 
        .Query("YO YO") 
       ) 
      ) 
     ) 
    ) 
); 

だけDiscussionIdの値を返すには、クエリ

{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "match": { 
      "text": { 
       "type": "phrase", 
       "query": "YO YO" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

を作る、あなたはsource filteringを使用することができます

client.Search<Message>(s => s 
    .Source(sf => sf 
     .Includes(f => f 
      .Field(ff => ff.DiscussionId) 
     ) 
    ) 
    .Query(q => !q 
     .MatchPhrase(m => m 
      .Field(f => f.Text) 
      .Query("YO YO") 
     ) 
    ) 
); 

そして、あなたがそれらすべてを取得したい場合、あなたはscroll API

var searchResponse = client.Search<Message>(s => s 
    .Scroll("1m") 
    .Source(sf => sf 
     .Includes(f => f 
      .Field(ff => ff.DiscussionId) 
     ) 
    ) 
    .Query(q => !q 
     .MatchPhrase(m => m 
      .Field(f => f.Text) 
      .Query("YO YO") 
     ) 
    ) 
); 

// fetch the next batch of documents, using the scroll id returned from 
// the previous call. Do this in a loop until no more docs are returned. 
searchResponse = client.Scroll<Message>("1m", searchResponse.ScrollId); 
+0

これらのクエリは、テキストに「YO YO」がないすべてのメッセージを返します。 でも、すべてのディスカッションには多くのメッセージがあります。いくつかは、 "YO YO"の1つのメッセージを持っています。上記のクエリですべての議論が返されることを意味します。 質問が正しく理解されましたか? –

+1

'Discussion'タイプはどのように見えますか?そのインデックスも持っていますか?ディスカッションとメッセージの間に親子関係があれば、 'has_child'クエリで' bool'' must_not'をラップします:https://www.elastic.co/guide/en/elasticsearch/reference/5.1/query -dsl-has-child-query.html。代わりに、 "YO YO"を含むすべてのディスカッションIDのリストを取得して、それを 'must_not'節のスクロールに送ります。 –

+0

は、" bool must_not in has_child "の最初のオプションのように思われます。 私はディスカッションをタイプとしてインデックスに追加します。 (私はこれから道を得ようとしましたが、私の唯一の選択肢のようです)。 –

関連する問題