2016-12-10 60 views
0

假設我有一個包含討論中代表消息的文檔的索引。
該文件擁有一個discussionId屬性。 (它也有自己的ID「代表MessageId」)

現在,我需要找到沒有文檔(消息)匹配查詢的所有discussionIds。
例如:
「找到所有discussionIds,有沒有消息包含文本‘溜溜’」Elasticsearch在其他文檔上查詢對象的聚合

我該怎麼辦呢?

類是類似於此:

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

討論許多消息的邏輯組。 挑戰是找到不包含特定消息的討論ID列表。 –

回答

1

你只需要包裝會在bool query must_not clause找到matches for the phrase「喲噗喲」查詢。

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

,它與operator overloading,可以縮短到

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

兩個生成查詢

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

只返回DiscussionId值,你可以使用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」的所有消息。 但仍然,所有的討論都有很多信息。一些,有一個「悠悠」的信息。所以這意味着在上面提出的查詢中,所有討論都會返回, 我理解你的查詢是否正確? –

+1

'Discussion'類型是什麼樣的?你是否也有這個索引?通過討論和消息之間的父/子關係,可以將'bool'' must_not'包裝在'has_child'查詢中:https://www.elastic.co/guide/en/elasticsearch/reference/5.1/query -dSL,有孩子,query.html。或者,你會得到一個所有包含「YO YO」的討論區的列表,然後將其作爲一個'must_not'子句中的滾動提供給 –

+0

看起來就像你的第一個選項,「bool must_not in has_child」將會成功。 我會將討論作爲一種類型添加到索引中。 (我試圖從中得到一些辦法,但似乎是我唯一的選擇)。 –