elasticsearch 如何在ElasticSearch中有条件地添加多个条件?
在以下筛选器查询中:
elasticsearch 如何在ElasticSearch中有条件地添加多个条件?,
elasticsearch,nest,
elasticsearch,Nest,在以下筛选器查询中: var searchResults = _client.Search<MyIndexable>(s => s .Query(q => q .Bool(b => b .Must( subQuery => subQuery.QueryString(qs => qs.OnFields(f => f.Title, f =&
var searchResults = _client.Search<MyIndexable>(s => s
.Query(q => q
.Bool(b => b
.Must(
subQuery => subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")),
subQuery => subQuery.Term(f => f.field1, "some string"),
subQuery => subQuery.Term(f => f.field2 , "some Guid")))));
有人能帮我做这件事吗?由于方法链接,您很难做到这一点 用json设置配置更容易处理。因为json是一个字符串,所以很容易将其打断并插入条件等 例如:
$config = '{
"query":
{';
if (condition) {
$config .= '"match":
{
"foo": "bar"
}';
}
$config .= '
}
}';
当然,您可以自由选择构建json字符串的方式。可以在Nest中完成。请参阅下面的代码:
var funcs = new List<Func<QueryDescriptor<MyIndexable>, QueryContainer>>();
funcs.Add(subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")));
if (request.field2) // I believe this is some bool variable
{
funcs.Add(subQuery => subQuery.Term(f => f.field1, "some string"));
}
funcs.Add(subQuery => subQuery => subQuery.Term(f => f.field2 , "some Guid"));
var searchResults = _client.Search<MyIndexable>(s => s
.Query(q => q
.Bool(b => b
.Must(funcs.ToArray()))));
var funcs=new List();
Add(subQuery.QueryString(qs=>qs.OnFields(f=>f.Title,f=>f.Description).Query(searchTerm+“*”));
if(request.field2)//我相信这是一个bool变量
{
Add(subQuery=>subQuery.Term(f=>f.field1,“一些字符串”);
}
Add(subQuery=>subQuery=>subQuery.Term(f=>f.field2,“someguid”);
var searchResults=\u client.Search(s=>s
.Query(q=>q
.Bool(b=>b
.Must(functs.ToArray());
bittusarkar,在上述情况下,如何让子查询实例在BoolFilterDescriptor(Must)下添加筛选器?就像我需要添加ExistFilter而不是QueryString,然后有条件地使用筛选器一样?“筛选器”:{“bool”:{“Must”:[{“exists”:{“field”:“Cid”}},{“exists”:{“field”:“prf”},{“term”:{“IsActive”:true},你不需要在任何地方定义子查询。它是Func
定义的一部分。我粘贴的代码在语法上是正确的。你可以用你想要实现的任何其他查询替换QueryString
。哦..是的,我知道了。在我的例子中,我使用了FilterDescriptor而不是QueryDescriptor,根据上面的json过滤器字符串..和它的w很好,谢谢你的帮助
var funcs = new List<Func<QueryDescriptor<MyIndexable>, QueryContainer>>();
funcs.Add(subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")));
if (request.field2) // I believe this is some bool variable
{
funcs.Add(subQuery => subQuery.Term(f => f.field1, "some string"));
}
funcs.Add(subQuery => subQuery => subQuery.Term(f => f.field2 , "some Guid"));
var searchResults = _client.Search<MyIndexable>(s => s
.Query(q => q
.Bool(b => b
.Must(funcs.ToArray()))));