Elasticsearch.net-范围查询

时间:2018-12-19 19:11:27

标签: c# elasticsearch

我正在尝试通过Elasticsearch.net(不是NEST)从C#查询Elasticsearch索引。具体来说,我需要获取自特定日期以来创建的所有状态为“成功”的文档。为了做到这一点,我有:

var query = new {
  query = new {
    match = new {
      field="status",
      query="success"
    }
  },

  range = new {
    ?
  }
};

我不确定range部分使用什么。实际上,我什至不确定query的语法是否正确。我真的不了解C#语法如何映射到Elasticsearch中的查询DSL。任何帮助表示赞赏。

谢谢!

3 个答案:

答案 0 :(得分:3)

类似的事情应该做:

var query = new {
  bool = new {
    must = new {
      match = new {
        field = "status",
        query = "success"
      }
    },
    filter = new {
      range = new {
        createDate = new {
          gt = "2018-12-01T00:00:00.000Z"
        }
      }
    }
  }
};

答案 1 :(得分:1)

  

我不太了解C#语法如何在Elasticsearch中映射到查询DSL。

通过查看提供的示例,我假设您要使用PosData.Serializable(query)。在这种情况下,查询对象(无论它是什么类型)都将被JSON序列化并发布到elasticsearch集群中,而无需进行任何修改。当您使用new {} C#语法创建对象时,默认情况下会使用与此对象的属性相同的键将其序列化为JSON。即对象

new {
    query = new {
        bool = new {
            must = new {
                term = new {
                    status = "success"
                }
            },
            filter = new {
                range = new {
                    date = new { gte = "2018-12-22T00:00:00.000Z" }
                }
            }
        }
    }
}

将被序列化并传递给elasticsearch,

"query": {
    "bool": {
        "must": {
            "term": {
                  "status": "success"
            }
        },
        "filter": {
            "range": {
               "date": { "gte": "2018-12-22T00:00:00.000Z" }
            }
        }
    }
}

因此,通过使用低级Elasticsearch客户端,您可以创建几乎1:1映射到查询DSL语法的对象。您可以从elastic.co复制示例,将“:”替换为“ = new”,从属性名称中删除引号,基本上就是这样。

答案 2 :(得分:0)

查询如下:

var query = new {
  bool = new {
    must = new {
      match = new {
        field = "status",
        query = "success"
      }
    },
    filter = new {
      range = new {
        createDate = new {
          gte = "2018-01-01T00:00:00.000Z",
          lt = "2019-01-01T00:00:00.000Z"
        }
      }
    }
  }
};