【问题标题】:How can I stop Nest from appending extra query around QueryRaw如何阻止 Nest 在 QueryRaw 周围附加额外查询
【发布时间】:2015-10-30 06:26:16
【问题描述】:

我正在从 0.11 升级到 Nest 1.7。

我所有的查询都是原始json格式,升级的时候,用我的查询执行原始查询搜索时出现,nest追加了一个外部查询,导致失败。

文档说它不会修改字符串,但这并不完全正确 - http://nest.azurewebsites.net/nest/writing-queries.html#raw-strings

初始查询:

  {
    "query": {
      "match_all": {}
    },
    "facets": {
      "field_one": {
        "terms": {
          "field": "my_favorite_field"
        }
      }
    },
    "from": 0,
    "size": 25
  }

使用 Nest 调用:

client.Search<MyType>(q => q.QueryRaw(query));

将查询转换为:

  {
    "query": {
      "query": {
        "match_all": {}
      },
      "facets": {
        "field_one": {
          "terms": {
            "field": "my_favorite_field"
          }
        }
      },
      "from": 0,
      "size": 25
    }
  }

第二个查询显然失败了。有什么简单的方法可以“禁用”这种行为。

我主要是尽量避免将一百个查询重写/转换为新的 DSL。

【问题讨论】:

    标签: elasticsearch nest elasticsearch-net


    【解决方案1】:

    几个cmets:

    1. 支持对 NEST 使用原始查询,但不应该是默认设置。您应该使用 POCO 为您生成查询。
    2. 分面已被弃用了一段时间,转而支持聚合

    所以我对您的原始查询问题没有解决方案,但也许现在是转换为 POCO 并转换为聚合的时候了。

    【讨论】:

    • 转换为 aggs 很简单,因为语法几乎相同,而且我的 ES 版本仍然支持构面。但是为什么原始查询不应该是默认的呢?
    • 很多原因:查询的编译时验证和重构立即浮现在脑海中。把它想象成实体框架:如果你愿意,你可以编写原始 SQL,但是使用 Linq-To-SQL 和 EF 为你做很多繁重的工作有很多优势。
    • 同意这些方面,虽然我经常在 sense/curl/etc 之间传递查询,所以让它们保持原始是有意义的。只是不确定为什么客户会为我执行该设计决策。甚至实体仍然提供 ExecuteCommand,因为有许多场景和查询在实体/poco 设计中是不可能的。理想情况下,我更喜欢控件在必要时同时使用两者。
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多