【问题标题】:Nest search query returning different results from the Elastic query DSL嵌套搜索查询从弹性查询 DSL 返回不同的结果
【发布时间】:2020-10-14 13:23:51
【问题描述】:

我有一个名为 challenges 的 ElasticSearch 索引,其中包含 Challenge 类型的对象。

当我在 Kibana 控制台中执行下面的过滤查询时,它返回了 9 个结果,都是正确的。

GET challenges/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "type": "Orphan"
          }
        }
      ]
    }
  }
}

但是,来自 Nest 客户端的以下查询返回零命中:

var challenges = await _client.SearchAsync<Challenge>(s => s
  .Query(q => +q
    .Term(t => t.Type, Models.Enums.ChallengeType.Orphan)
  )
);

我也尝试了以下变体,但无济于事:

var challenges = await _client.SearchAsync<Challenge>(s => s
  .Query(q => q
    .Bool(b => b
      .Filter(f => f
        .Term(t => t
          .Field(f => f.Type)
          .Value(challengeType)
        )
      )
    )
  )
);

我要过滤的类型属性是一个具有以下值的枚举:

public enum ChallengeType
{
  SixDimensions,
  Intro,
  Normal,
  UserCreated,
  Orphan,
  Youmate
}

并作为关键字存储在索引中。 实际在索引中的示例对象:

{
  "id": "3bce0ce1-9676-4858-b165-1442a443bf5a",
  "icon": "water-bottle.png",
  "index": 0,
  "default-time": "09:00",
  "default-days": [
    "Saturday",
    "Monday",
    "Wednesday"
  ],
  "default-repetitions": 3,
  "category": "A",
  "title": {
    "Persian": "آب خوردن"
  },
  "dimension": "Physical",
  "type": "Orphan",
  "id-package": "00000000-0000-0000-0000-000000000000",
  "intro-pages": [ ],
  "date-created": "2020-10-14T12:39:21.8427517+03:30",
  "notify": true,
  "template": 0,
  "belongs-to-user": "00000000-0000-0000-0000-000000000000",
  "active": false
}

对于为什么控制台的结果与从 Nest 客户端执行时的结果不同,您有什么建议吗?

【问题讨论】:

  • NEST 客户端生成的查询是什么?你看了吗?
  • 我不知道该怎么做。如果它应该在 ApiCall -> Uri -> Query 中的响应对象中,那么它只是这样:“?typed_keys = true”并且没有指示实际过滤器查询。
  • 您收到的搜索响应有一个名为DebugInformation 的属性。您可以检查以查看由NEST 客户端生成的查询。
  • 这里是:从 POST 上成功的 (200) 低级别调用构建的有效 NEST 响应:/challenges/_search?typed_keys=true # 此 API 调用的审计跟踪:- [1] HealthyResponse:节点:localhost:9200 接受:00:00:00.4857527 # 请求: # 响应:
  • @SaiGummaluri 谢谢。我在连接设置上禁用了直接流式传输,它显示了实际请求。查看信息,我发现问题在于我已将该属性索引为其字符串等价物,但查询正在请求其枚举整数值。因此问题。当我在枚举上调用 .ToString() 时它解决了。

标签: c# elasticsearch nest


【解决方案1】:

枚举应使用StringEnumAttribute 标记以序列化为字符串

[StringEnum]
public enum ChallengeType
{
    SixDimensions,
    Intro,
    Normal,
    UserCreated,
    Orphan,
    Youmate
}

没有这个,枚举将被序列化为其底层整数值。

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2019-07-20
    • 1970-01-01
    • 2018-09-28
    • 2021-09-01
    • 2015-09-24
    • 2016-07-28
    • 2017-06-11
    • 2020-07-26
    相关资源
    最近更新 更多