elasticsearch 使用Elasticsearch和NEST从id返回以下五个文档
我想我已经一次又一次地盯着一个错误看得目瞪口呆,真的需要一些输入。我有一套时间序列文件。现在,我想查找特定id后面的五个文档。我首先获取单个文档。然后获取以下五个没有此id的文档:
elasticsearch 使用Elasticsearch和NEST从id返回以下五个文档,
elasticsearch,nest,
elasticsearch,Nest,我想我已经一次又一次地盯着一个错误看得目瞪口呆,真的需要一些输入。我有一套时间序列文件。现在,我想查找特定id后面的五个文档。我首先获取单个文档。然后获取以下五个没有此id的文档: var documents=client.Search(s=>s .Query(q=>q .ConstantScore(cs=>cs .Filter(f=>f .Bool(b=>b .Must(Must=>Must .DateRange(dr=>dr.Field(Field=>Field.Time)。大于等于(sta
var documents=client.Search(s=>s
.Query(q=>q
.ConstantScore(cs=>cs
.Filter(f=>f
.Bool(b=>b
.Must(Must=>Must
.DateRange(dr=>dr.Field(Field=>Field.Time)。大于等于(startDoc.Time))
.MustNot(MustNot=>MustNot
.Term(Term=>Term.Id,startDoc.Id))
))))
.采取(5)
.Sort(Sort=>Sort.升序(asc=>asc.Time)).Documents;
我的问题是,虽然返回了5个文档并进行了正确排序,但开始文档位于返回的数据中。我正在尝试使用“不得”过滤器将其过滤掉,但似乎不起作用。我很确定我在其他地方也这样做过,所以可能是一个我根本看不到的小问题:)
下面是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字段可能是已分析的字段。分析的字段被标记化。有一个未分析的版本,用于精确匹配(就像你在评论中提到的,你有一个),并在你的过滤器中使用它将修复你看到的差异
更多关于分析字段与非分析字段的信息除非我在这里遗漏了什么,为什么不直接使用
GreaterThan
而不是GreaterThanOrEquals
,然后省略起始文档这是一个很好的观点。但可能还有其他文件的日期和时间相同。明白。我正在建立一个样本来重现你的情景。同时,您能否共享NEST
客户端在您的案例中生成的查询?你已经看过了吗?另外,关于映射,有没有可能分析id字段?你搞定了!id字段的类型为text
,我现在确实记得过去也有类似的问题。我甚至创建了一个名为id.keyword
的子字段,类型为keyword
(变老了)