关于相对简单的文档结构,NEST及其查询和过滤器语法存在一些问题。
给定一个文档类型“ BlogPosts”,如下所示:
public class BlogPosts
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public DateTime CreatedAt { get; set; }
public string Content { get; set; }
public List<string> Tags { get; set; }
public List<Guid> ReferencedUserIds { get; set; }
}
我可以将实例发送到我的ES实例,并将它们索引好,即,已发送/索引的json如下所示:
{
"id": "ad61de92-c6f6-49c1-84eb-0a4dfdf86cc0",
"userId": "c43e1be7-0b8c-4271-bf29-7434719fbcbf",
"createdAt": "2015-04-05T11:23:58.1017261Z",
"content": "Some Specific Word in here",
"tags": [
"Some",
"Tag",
"SomeSpecialTag"
],
"referencedUserIds": [
"f6a714a0-318d-49d7-9940-f0480c002577",
"e582c24c-1c82-43f8-8e80-09e19749a0a3",
"11165e0b-8e4f-466a-8c37-e0cfec81850c"
]
}
现在使用NEST,我可以轻松地使用“ SomeSpecialTag”标签查询所有BlogPost,如下所示:
var postsQueriedForSpecialTag = elasticClient.Search<BlogPosts>(postSearch => postSearch
.Index(indexName)
.Query(
queryDescriptor => queryDescriptor.Match(match => match.OnField(posts => posts.Tags).Query("SpecialTag"))));
..但我真正想要的是
a)查询特定内容和
b)根据特定标签(也可以根据特定UserId)进行过滤
但是即返回0个文档:
var postsFilteredForSpecialTag = elasticClient.Search<BlogPosts>(postSearch => postSearch
.Index(indexName)
.Query(
queryDescriptor => queryDescriptor.QueryString(q => q.Query("Some Specific Word")))
.Filter(descriptor => descriptor.Nested(filterDescriptor => filterDescriptor.Path(posts => posts.Tags).Filter(descriptor1 => descriptor1.Term(posts => posts.Tags, "SpecialTag")))));
..我不知道为什么。更确切地说,List<string or Guid>
如上所述,要对嵌套结构进行过滤的正确NEST语法是什么?
*更新:
遵循Jettro的提示并改为使用“应该”过滤器(请参阅https://stackoverflow.com/a/28001971/2591),它现在可以正常工作。现在,最终查询+过滤器代码如下所示:
var postsFilteredForSpecialTag = elasticClient.Search<BlogPosts>(postSearch => postSearch
.Index(indexName)
.Query(
queryDescriptor => queryDescriptor.QueryString(q => q.Query("Some Specific Word")))
.Filter(descriptor => descriptor.Bool(filterDescriptor => filterDescriptor.Should(descriptor1 => descriptor1.Term(posts => posts.Tags, "specialtag")))));
这可能是您映射中的问题。尽管我不是NEST专家,但这可能是一个普遍的问题。可能默认的过滤器是术语过滤器?如果未指定标签字段的映射,则为标准分析仪。使用该分析器,将删除大写字符。进行查询将具有相同的效果,但是将不分析术语过滤器,因此将找不到带有大写字母“ SpecialTag”的术语。将其更改为“特殊标签”,然后重试或在映射中将字段设置为not_analyzed。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句