首页 > 解决方案 > 如何根据字符串数组的第一个元素从弹性搜索返回文档?

问题描述

我在弹性搜索中有如下​​文件:

[
     {
       _index: myindex,
       name: John,
       hobbies: Swimming, Golfing
     },
     {
       _index: myindex,
       name: Alice,
       hobbies: Golfing, Swimming
     },
     {
       _index: myindex,
       name: Alice,
       hobbies: Golfing
     },
]

我需要一种方法来返回Hobbies在爱好字段中列为第一个的所有文档。

我正在使用弹性搜索 NEST 库来解决这个问题。我创建了一个弹性搜索服务,用 C# 构建来创建我的查询。在此服务中,我查找所有用户并将过滤器应用于搜索。在这种情况下,我想获取所有Hobbies列为Golfing第一个的文件,如果Golfing不是第一个爱好,那么我不想要这些文件。

模型:

public class User {
  public const string Name {get; set;}
  public List<string> Hobbies {get; set;}
}

我的查询:

 query = query.Bool(b => b
    .Filter(filter => filter
      .Bool(b2 => b2
        .Must(must => must
          .Match(match => match
             .Field(l => l.Hobbies.First() == "Golfing")
            )
          )
       )

    )
);

我想过滤文档,以便我只获取爱好首先列为高尔夫的文档。我的预期结果应该是:

[
     {
       _index: myindex,
       name: Alice,
       hobbies: Golfing, Swimming
     },
     {
       _index: myindex,
       name: Alice,
       hobbies: Golfing
     },
]

但是,它正在返回所有三个。我如何使它只返回文件,其爱好以打高尔夫球作为第一个爱好?

标签: c#.netelasticsearchnest

解决方案


我认为实现这一目标的唯一方法是使用脚本查询

在您的情况下,例如:

var response = client.Search(s => s
   .Query(q => q
       .Script(sq => sq
            .Source("doc['hobbies'].value[0]. == 'Golfing'")
            )
       )
   )
);

推荐阅读