C# Nest(ElasticSearch)嵌套数组搜索:匹配任意页码返回整书
解决Elasticsearch嵌套数组匹配任意元素的问题
需求:当书籍的任意一页包含指定引文时,返回完整的书籍信息。
模型定义
public class Book { public string Title { get; set; } public string Author { get; set; } public List<Page> Pages { get; set; } } public class Page { public int Nr { get; set; } public string Content { get; set; } }
问题根源
当前查询代码仅能匹配第一页包含引文的书籍,原因是使用了f => f.Pages.First().Content,这会被Elasticsearch解析为只针对嵌套数组的第一个元素(Pages[0].Content)进行匹配,完全忽略了其他页码的内容。
解决方案
修改字段引用方式,让查询针对所有嵌套的Page元素的Content字段进行匹配。Elasticsearch的嵌套查询会自动遍历数组中的所有元素,只要任意一页内容符合条件,对应的Book就会被完整返回。
修正后的代码(表达式方式)
var searchResponse = client.Search<Book>(s => s .Query(q => q .Nested(n => n .Path(p => p.Pages) .Query(nq => nq .Match(m => m .Field(f => f.Pages.Select(p => p.Content)) .Query("lorem ipsum") ) ) ) ) );
修正后的代码(字符串字段名方式,更直观)
var searchResponse = client.Search<Book>(s => s .Query(q => q .Nested(n => n .Path(p => p.Pages) .Query(nq => nq .Match(m => m .Field("Pages.Content") .Query("lorem ipsum") ) ) ) ) );
说明
两种写法都能让Elasticsearch遍历所有Page对象的Content字段进行匹配,只要书籍的任意一页包含"lorem ipsum"引文,该书籍就会被纳入检索结果并完整返回。
内容的提问来源于stack exchange,提问作者KwarcPL
相关产品推荐
相关产品推荐

