首页 > 解决方案 > 使用 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"
         }
      }
   ]
}

标签: elasticsearchnest

解决方案


这可能会发生,因为 id 字段可能是已分析的字段。分析的字段被标记化。拥有一个未分析的版本,用于完全匹配(就像您在评论中提到的那样,您有一个)并在您的过滤器中使用它可以解决您看到的差异。

更多关于分析与非分析领域的信息在这里


推荐阅读