2016-02-29 96 views
1

使用NEST(1.7.1)我有一個特定的搜索,其中一個字段應該匹配一些值的集合或者該字段應該爲空。似乎trival,但我不能創建這個查詢,所以結果將是相同的,因爲當我沒有過濾這個領域的文件。Nest Elasticsearch搜索空值

文件:

public class Document 
{ 
    ... 
    [ElasticProperty(Index = FieldIndexOption.NotAnalyzed)] 
    public string Field{ get; set; } 
} 

查詢從給定集合匹配的任何值:

Filter<Document>.Query(q => q.Terms(p=> p.Field, matchingCollection)); 

是爲了匹配那些文件,已經NULL設置爲現場我嘗試添加:

matchingCollection.Add(string.Empty); 
matchingCollection.Add("NULL"); 

但沒有任何成功。 任何想法?謝謝:)

+0

它具有字符串值「NULL」嗎,還是該字段應爲null即丟失? –

+0

這個字段存在,當我把這個文件給elasticsearch時,值是「」(string.Empty) –

+0

舊的,但僅供將來參考 - 它的無條件查詢功能,可以用.Strict )/現在已經過時/ –

回答

0

這是最好的一個,我能找到

Filter<Document>.Query(q1 =>q1.Bool(q2 => q2 
           .MustNot(q3 => q3 
           .Exists(q4 => q4 
           .Field(q5 => q5.Field))))); 

希望有更好的答案。

1

對於NEST 1.x中,類似如下的

client.Search<Document>(x => x 
    .Query(q => q 
     .Terms(f => f.Field, new [] { "term1", "term2", "term3" }) || q 
     .Filtered(fq => fq 
      .Filter(fqf => fqf 
       .Missing(f => f.Field) 
      ) 
     ) 
    ) 
); 

產生以下查詢

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "terms": { 
      "field": [ 
       "term1", 
       "term2", 
       "term3" 
      ] 
      } 
     }, 
     { 
      "filtered": { 
      "filter": { 
       "missing": { 
       "field": "Field" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

對於NEST 2.X起,像

client.Search<Document>(x => x 
    .Query(q => q 
     .Terms(t => t 
      .Field(f => f.Field) 
      .Terms("term1","term2","term3") 
     ) || !q 
     .Exists(e => e 
      .Field(f => f.Field) 
     ) 
    ) 
); 

這產生以下查詢

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "terms": { 
      "field": [ 
       "term1", 
       "term2", 
       "term3" 
      ] 
      } 
     }, 
     { 
      "bool": { 
      "must_not": [ 
       { 
       "exists": { 
        "field": "field" 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
}