'和''或'在ElasticSearch中查询

时间:2014-10-31 07:47:48

标签: c# .net linq elasticsearch

public class User 
{
  public string Email { get; set; }
  public int Age { get; set; }
  public bool Active { get; set; }
}

client.Index(new User { Email ="test@test.te" });

在Linq C#中查询例如:

rep.Where(user=>user.Email=="test@test.te" &&  (user.Age>18 || user.Active== true));

如何为Elasticsearch进行此查询(我的意思是Elasticsearch中的相同查询)?

1 个答案:

答案 0 :(得分:2)

您可以使用以下组合:

  • range过滤了age字段(reference
  • term过滤了emailactive字段(reference
  • bool过滤器,其中包含should子句(相当于OR),以合并ageactive过滤器(reference
  • 另一个bool过滤器,用于将前一个过滤器与email子句中的must过滤器相结合(相当于AND)
  • filtered查询,可以使用上面定义的过滤器。

了解differences between query and filters

可能对您有用

你应该这样结束:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "email": "test@test.te"
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "range": {
                      "age": {
                        "gt": 18
                      }
                    }
                  },
                  {
                    "term": {
                      "active": "true"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

注意:

要使此查询生效,电子邮件字段必须为not_analyzed,因为字词过滤器会查找完全相同的值。