Nest Elasticsearch搜索空值

时间:2016-02-29 15:31:06

标签: c# elasticsearch nest

使用NEST(1.7.1)我有一个特定的搜索,其中一个字段应匹配某些值集合或该字段应为null。看似trival但是我无法创建这个查询,所以当我没有通过这个字段过滤我的文档时,结果将与结果相同。

文件:

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");

但没有任何成功。 有任何想法吗 ?谢谢:))

2 个答案:

答案 0 :(得分:2)

对于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"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

答案 1 :(得分:0)

这是我能找到的最好的

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

希望有更好的答案。