c# - 使用 NEST(ElasticSearch) 搜索嵌套数组
问题描述
我想使用 Nest 过滤嵌套数组中的数据。鉴于我有以下课程:
public class Package
{
public IEnumerable<PackageItem> PackageItems { get; set; }
}
public class PackageItem
{
public string Title { get; set; }
public decimal Price { get; set; }
}
我已经使用 NEST 在 ElasticSearch 中索引了这些数据:这是我的数据:
"hits" : [
{
"_index" : "packages",
"_type" : "_doc",
"_id" : "cf08b05c-c8b5-45cb-bca8-17267c3613fb",
"_score" : 1.0,
"_source" : {
"id" : "cf08b05c-c8b5-45cb-bca8-17267c3613fb",
"PackageItems" : [
{
"Title" : "some-title",
"price" : 100000.0
},
{
"Title" : "some-title",
"price" : 200000.0
}
]
}
},
{
"_index" : "packages",
"_type" : "_doc",
"_id" : "39436cb3-483e-4fb4-92e4-4e06ecad27a1",
"_score" : 1.0,
"_source" : {
"id" : "39436cb3-483e-4fb4-92e4-4e06ecad27a1",
"PackageItems" : [
{
"Title" : "some-title",
"price" : 100000.0
},
{
"Title" : "some-title",
"price" : 400000.0
}
]
}
},
{
"_index" : "packages",
"_type" : "_doc",
"_id" : "cd5d3587-838b-46ec-babc-d756c5587396",
"_score" : 1.0,
"_source" : {
"id" : "cd5d3587-838b-46ec-babc-d756c5587396",
"PackageItems" : [
{
"Title" : "some-title",
"price" : 300000.0
},
{
"Title" : "some-title",
"price" : 500000.0
}
]
}
}
]
我想过滤具有 minimumPackageItemPrice:100000 和 maximumPackageItemPrice:400000 的包。我应该使用 NEST 执行什么查询?
结果应该是这样的:
"hits" : [
{
"_index" : "packages",
"_type" : "_doc",
"_id" : "cf08b05c-c8b5-45cb-bca8-17267c3613fb",
"_score" : 1.0,
"_source" : {
"id" : "cf08b05c-c8b5-45cb-bca8-17267c3613fb",
"PackageItems" : [
{
"Title" : "some-title",
"price" : 100000.0
},
{
"Title" : "some-title",
"price" : 200000.0
}
]
}
},
{
"_index" : "inventories",
"_type" : "_doc",
"_id" : "39436cb3-483e-4fb4-92e4-4e06ecad27a1",
"_score" : 1.0,
"_source" : {
"id" : "39436cb3-483e-4fb4-92e4-4e06ecad27a1",
"PackageItems" : [
{
"Title" : "some-title",
"price" : 100000.0
},
{
"Title" : "some-title",
"price" : 400000.0
}
]
}
}
]
解决方案
要通过 触发 Elasticsearch 上的范围查询NEST
,您可以使用范围查询。方法是您可以为您的场景构建一个范围查询,并通过NEST
客户端的搜索方法触发该查询。
为您的案例生成范围查询
// This method builds the range query where price should be between
// 100000.0 and 400000.0 (inclusive range in this case)
private static QueryContainer BuildNestedRangeQuery()
{
return new QueryContainerDescriptor<Package>()
.Nested(n =>
n.Path(p => p.PackageItems)
.Query(q => q
.Range(r => r
.Field(f => f.PackageItems.FirstOrDefault().Price)
.GreaterThanOrEquals(100000.0)
.LessThanOrEquals(400000.0))
)
)
)
}
触发搜索
搜索可以通过NEST
客户端触发,如下图所示。这可能会根据您自己的实现而有所不同。但是,上述范围查询保持不变。
// Replace T with type of your choice and client is NEST client
var result = client.Search<T>(
.From(0)
.Size(20)
.Query(q => BuildNestedRangeQuery())
// other methods that you want to chain go here
)
推荐阅读
- mysql - MYsql更新多行顺序列中的序列号
- reactjs - 类型“字符串”不可分配给类型“从不”并且类型“未知”不可分配给反应打字稿中的类型“从不”错误
- powershell-5.0 - 使用powershell在文件中进行字符串处理
- angular - Angular 中的可选链
- kotlin - 当我只想执行 kotlin 脚本时,为什么 IntelliJ IDEA 正在构建 maven 项目?
- python - 异常处理 - 列表索引超出范围
- python - 我应该如何使用 asyncio 设计并发管道?
- firebase - 断言失败:第 133 行第 12 行:'file.absolute.existsSync()':不正确
- google-cloud-platform - GCP 中的 Kubeflow 元数据存储
- c# - 如何通过 aspose.diagram 将文本的方向更改为 rtl