【问题标题】:Elasticsearch.net - Range QueryElasticsearch.net - 范围查询
【发布时间】:2019-05-20 07:56:34
【问题描述】:

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

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

  range = new {
    ?
  }
};

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

谢谢!

【问题讨论】:

  • 你试过给 github 维护者发消息吗?

标签: c# elasticsearch


【解决方案1】:

应该这样做:

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

【讨论】:

    【解决方案2】:

    我不太明白 C# 语法如何映射到 Elasticsearch 中的 Query 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”,从属性名称中删除引号,基本上就是这样。

    【讨论】:

      【解决方案3】:

      查询应该是这样的:

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

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        相关资源
        最近更新 更多