美好的一天:
我正在使用ElasticSearch / NEST来查询嵌套对象。我意识到的是我的嵌套对象为空,尽管现在存在匹配,但仍返回了父对象。
ISearchResponse<Facility> responses = await this._elasticClient.SearchAsync<Facility>(a => a.Query(q =>
q.Bool(b =>
b.Must(m =>
m.Nested(n =>
n.Query(nq =>
nq.Term(t =>t.Field(f => f.Reviews.First().UserId).Value(user.Id))
).InnerHits(ih => ih.From(0).Size(1).Name("UserWithReview"))
)
)
)
));
当我查看生成的查询时,我更加困惑正在发生的事情:
Successful low level call on POST: /dev/doc/_search?typed_keys=true
# Audit trail of this API call:
- [1] HealthyResponse: Node: http://localhost:9200/ Took: 00:00:00.9806442
# Request:
{}
如您所见,请求为空。
答案 0 :(得分:1)
您尚未使用所需的所有属性定义嵌套查询;它缺少Path
属性,该属性告诉Elasticsearch在哪个文档字段(即路径)上执行查询。查看查询的其余部分,看起来应该是Reviews
属性
ISearchResponse<Facility> responses =
await this._elasticClient.SearchAsync<Facility>(a => a
.Query(q => q
.Bool(b => b
.Must(m => m
.Nested(n => n
.Path(f => f.Reviews) // <-- missing
.Query(nq => nq
.Term(t => t
.Field(f => f.Reviews.First().UserId)
.Value(user.Id)
)
)
.InnerHits(ih => ih.From(0).Size(1).Name("UserWithReview"))
)
)
)
)
);