有用过滤条件是从数据库中获取的而且不知道多少个数,所以动态拼接条件
在官网找到一下 最后在这个文章中找到灵感 https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/bool-queries.html
在循环中使用按位分配,以将许多查询组合成一个更大的布尔值.NET
在此示例中,我们使用&= Assign运算符创建了一个带有1000个must子句的布尔查询。
var c = new QueryContainer();
var q = new TermQuery { Field = "x", Value = "x" };
for (var i = 0; i < 1000; i++)
{
c &= q;
}
官网没写怎么用,我又研究了一下,代码如下
s => s.Index($"{indices.GetString("xxx")}").From(0).Size(10)
.Query(q => q
.Bool(b => b
.Must(c) // 动态拼接
)
由于业务需求是 屏蔽 数据库中的这些
查找的这篇官方文档后使用must_not https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
所以我又改了一下
// 需要屏蔽的 关键字 集合
var queryContainer = new QueryContainer();
foreach (var keyValue in keyList) // 数据库中查出来的 List<string> keyList
{
var x = new MatchPhraseQuery { Field = "namecn", Query = keyValue };
queryContainer |= x; // 添加 一个需要过滤掉的关键字 注意这里是 | (或 而且是一个)
}
然后 使用 MustNot 来过滤掉电邮
s => s.Index($"{indices.GetString("xxx")}").From(0).Size(10)
.Query(q => q
.Bool(b => b
.MustNot(queryContainer ) // 动态拼接
)