使用嵌套属性构造NEST / ElasticSearch查询

时间:2015-10-14 13:42:47

标签: elasticsearch nest

我在C#中使用NEST查询ElasticSearch数据库(丹麦CVR注册表)。我正在尝试制定一个查询该方案的查询:

relations: [
    {
        participant: {
            key: 123123
        },
        organisations: [
            {
                organisationName: {
                    name: "some string",
                    period: {
                        from: "SOME DATE"
                        to: "SOMEDATE OR NULL"
                    }
                },
                ... more of similar objects ..
            }
        ]
    },
    .. more of similar objects ..
]

我的问题是我需要找到具有某个participant.key值的文档,同时在organisations.organisationName.period.to <中有一个特定的organisations.organisationName.name和一个缺失或空值。 / p>

我知道我需要使用嵌套查询来获取在to字段中具有空值和在name字段中具有特定名称的文档,但除此之外,我还需要在特定字符中具有特定键。 .key领域,这就是我遇到麻烦的地方。请注意,我正在检查的所有3个字段必须位于相同的关系对象中,并且to和name字段必须位于同一organisationName对象中。

没有关键部分作为JSON查询的查询是:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path":       "relations.organisations.organisationName",
            "score_mode": "max", 
            "query": {
              "bool": {
                "must": [
                  { "match": { "relations.organisations.organisationName.name": "EJERREGISTER" }},
                  {"filtered": { "filter" : {
                   "missing" : { "field" : "relations.organisations.organisationName.period.to" }
                  } } }
                ]
        }}}}
      ]
}}}

希望有人在NEST Query DSL中进行这些查询。我也可以使用纯ElasticSearch JSON查询,但.NET等价物将是我的首选选项:)

提前致谢!

1 个答案:

答案 0 :(得分:0)

经过一些实验,我得出的结论是,我的问题的正确答案将是一个嵌套查询的查询:1。检查密钥,并且2.有一个嵌套查询,可以完成组织中我需要的其他事情。 organisationName对象。

但是,我无法完全验证这一点,因为我查询的数据库没有标记为嵌套的关系对象(我不能更改它,因为它是一个政府数据库)

我的解决方法是检索与我的密钥相关的所有关系,然后过滤掉内存中剩余的对象,因为在我的场景中这不是太多开销。

编辑:作为后续工作,我正在使用的外部数据库添加了嵌套子句,它的工作原理如上所述。