使用NEST(1.7.1)我有一个特定的搜索,其中一个字段应匹配某些值集合或该字段应为null。看似trival但是我无法创建这个查询,所以当我没有通过这个字段过滤我的文档时,结果将与结果相同。
文件:
public class Document
{
...
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
public string Field{ get; set; }
}
查询以匹配给定集合中的任何值:
Filter<Document>.Query(q => q.Terms(p=> p.Field, matchingCollection));
还要匹配那些将NULL设置为我试图添加的字段的文档:
matchingCollection.Add(string.Empty);
matchingCollection.Add("NULL");
但没有任何成功。 有任何想法吗 ?谢谢:))
答案 0 :(得分:2)
对于NEST 1.x,类似于以下内容
client.Search<Document>(x => x
.Query(q => q
.Terms(f => f.Field, new [] { "term1", "term2", "term3" }) || q
.Filtered(fq => fq
.Filter(fqf => fqf
.Missing(f => f.Field)
)
)
)
);
产生以下查询
{
"query": {
"bool": {
"should": [
{
"terms": {
"field": [
"term1",
"term2",
"term3"
]
}
},
{
"filtered": {
"filter": {
"missing": {
"field": "Field"
}
}
}
}
]
}
}
}
对于NEST 2.x以上,类似
client.Search<Document>(x => x
.Query(q => q
.Terms(t => t
.Field(f => f.Field)
.Terms("term1","term2","term3")
) || !q
.Exists(e => e
.Field(f => f.Field)
)
)
);
产生以下查询
{
"query": {
"bool": {
"should": [
{
"terms": {
"field": [
"term1",
"term2",
"term3"
]
}
},
{
"bool": {
"must_not": [
{
"exists": {
"field": "field"
}
}
]
}
}
]
}
}
}
答案 1 :(得分:0)
这是我能找到的最好的
Filter<Document>.Query(q1 =>q1.Bool(q2 => q2
.MustNot(q3 => q3
.Exists(q4 => q4
.Field(q5 => q5.Field)))));
希望有更好的答案。