elasticsearch - 使用 Elasticsearch 和 NEST 从 id 返回以下五个文档
问题描述
我想我一遍又一遍地盯着错误看,真的可以使用一些输入。我有一组时间序列的文档。现在我想查找特定 id 后面的五个文档。我首先获取该单个文档。然后获取以下五个没有此 id 的文档:
var documents = client.Search<Document>(s => s
.Query(q => q
.ConstantScore(cs => cs
.Filter(f => f
.Bool(b => b
.Must(must => must
.DateRange(dr => dr.Field(field => field.Time).GreaterThanOrEquals(startDoc.Time))
.MustNot(mustNot => mustNot
.Term(term => term.Id, startDoc.Id))
))))
.Take(5)
.Sort(sort => sort.Ascending(asc => asc.Time))).Documents;
我的问题是,虽然返回并正确排序了 5 个文档,但起始文档在返回的数据中。我正在尝试使用 must not 过滤器将其过滤掉,但似乎不起作用。我很确定我在其他地方做过这个,所以可能是一个我根本看不到的小问题:)
这是 NEST 生成的查询:
{
"query":{
"constant_score":{
"filter":{
"bool":{
"must":[
{
"range":{
"time":{
"gte":"2020-08-31T10:47:12.2472849Z"
}
}
}
],
"must_not":[
{
"term":{
"id":{
"value":"982DBC1BE9A24F0E"
}
}
}
]
}
}
}
},
"size":5,
"sort":[
{
"time":{
"order":"asc"
}
}
]
}
解决方案
这可能会发生,因为 id 字段可能是已分析的字段。分析的字段被标记化。拥有一个未分析的版本,用于完全匹配(就像您在评论中提到的那样,您有一个)并在您的过滤器中使用它可以解决您看到的差异。
更多关于分析与非分析领域的信息在这里
推荐阅读
- http - Arduino GET 请求解析大数据
- graphql - 如何在 GraphQL SDL 中使用时间类型作为标量?
- c# - 如何检查 DataGridView 单元格是否具有自定义 BackColor
- javascript - 运行函数
- python - 按 TimeDelta Python Pandas 分组
- go - sync.Map 是否适合此用例?还是RW互斥锁更好
- node.js - 主机上的 NodeJS SSL,我怎样才能让它工作?
- testng - 未能执行目标 org apache maven 插件 maven-surefire-plugin
- flutter - Flushbar 编译器问题
- javascript - Vue.js 多个模态中的多个过滤器