如何基于字符串数组的第一个元素从elasticsearch返回文档?

时间:2019-06-25 15:36:35

标签: c# .net elasticsearch nest

我的弹性搜索文档如下:

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

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

我正在使用弹性搜索NEST库来解决此问题。我创建了一个用C#构建的Elasticsearch服务来创建查询。在此服务中,我进行了查找以获取所有用户并将筛选器应用于搜索。在这种情况下,我想首先获取其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
     },
]

但是,它返回所有三个。我如何做到这一点,使其仅返回爱好是高尔夫的第一爱好的文件?

1 个答案:

答案 0 :(得分:0)

我认为实现这一目标的唯一方法是使用scrip query

在您的情况下,例如:

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