Nest ElasticSearch 添加条件条款
Nest ElasticSearch adding conditional Terms
我正在构建以下查询,请注意过滤 companyGroupId
我似乎找不到合适的方法来添加和条件 Term
.
我想检查 includeTerminationDate
值并有条件地添加 term
所以简而言之,如果 false
不要 return 带有终止日期的记录。
private Func<QueryContainerDescriptor<EmployeeDocument>, QueryContainer> EmployeeSearchQuery(string query, long companyGroupId, bool includeTerminationDate)
{
return q => q
.MultiMatch(m => m
.Query(query)
.Type(TextQueryType.MostFields)
.MinimumShouldMatch("90%")
.Fields(f => f
.Field(ff => ff.FullName, 3)
.Field(ff => ff.Number, 3)
.Field(ff => ff.Email)
.Field(ff => ff.JobNumber)
.Field(ff => ff.Description))) && q.Term(f => f.CompanyGroupId, companyGroupId);
}
原因之一就是复制代码并根据条件添加术语。但我想保持 DRY Principle
。另一种方式是类似于下面的方式,我似乎无法弄清楚。
return q => q
.MultiMatch(m => m
.Query(query)
.Type(TextQueryType.MostFields)
.MinimumShouldMatch("90%")
.Fields(f => f
.Field(ff => ff.FullName, 3)
.Field(ff => ff.Number, 3)
.Field(ff => ff.Email)
.Field(ff => ff.JobNumber)
.Field(ff => ff.Description))) && q.Term(f => f.CompanyGroupId, companyGroupId)
&& !includeTerminationDate ? q.Term(f => f.TerminationDate, null) : 'Otherwise do not include term';
实现此目的的一种方法是将表达式转换为方法组,并有条件地添加查询
private Func<QueryContainerDescriptor<EmployeeDocument>, QueryContainer> EmployeeSearchQuery(string query, long companyGroupId, bool includeTerminationDate)
{
return q =>
{
var qc = q.MultiMatch(m => m
.Query(query)
.Type(TextQueryType.MostFields)
.MinimumShouldMatch("90%")
.Fields(f => f
.Field(ff => ff.FullName, 3)
.Field(ff => ff.Number, 3)
.Field(ff => ff.Email)
.Field(ff => ff.JobNumber)
.Field(ff => ff.Description))) &&
q.Term(f => f.CompanyGroupId, companyGroupId);
// whatever your logic is for adding termination date
if (includeTerminationDate)
qc &= q.Term(f => f.TerminationDate, DateTime.UtcNow);
return qc;
};
}
然后使用
client.Search<EmployeeDocument>(s => s
.Query(EmployeeSearchQuery("query", 2, false))
);
发出
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"type": "most_fields",
"query": "query",
"minimum_should_match": "90%",
"fields": [
"fullName^3",
"number^3",
"email",
"jobNumber",
"description"
]
}
},
{
"term": {
"companyGroupId": {
"value": 2
}
}
}
]
}
}
}
和
client.Search<EmployeeDocument>(s => s
.Query(EmployeeSearchQuery("query", 2, true))
);
发出
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"type": "most_fields",
"query": "query",
"minimum_should_match": "90%",
"fields": [
"fullName^3",
"number^3",
"email",
"jobNumber",
"description"
]
}
},
{
"term": {
"companyGroupId": {
"value": 2
}
}
},
{
"term": {
"terminationDate": {
"value": "2018-05-16T23:21:16.8309753Z"
}
}
}
]
}
}
}
我正在构建以下查询,请注意过滤 companyGroupId
我似乎找不到合适的方法来添加和条件 Term
.
我想检查 includeTerminationDate
值并有条件地添加 term
所以简而言之,如果 false
不要 return 带有终止日期的记录。
private Func<QueryContainerDescriptor<EmployeeDocument>, QueryContainer> EmployeeSearchQuery(string query, long companyGroupId, bool includeTerminationDate)
{
return q => q
.MultiMatch(m => m
.Query(query)
.Type(TextQueryType.MostFields)
.MinimumShouldMatch("90%")
.Fields(f => f
.Field(ff => ff.FullName, 3)
.Field(ff => ff.Number, 3)
.Field(ff => ff.Email)
.Field(ff => ff.JobNumber)
.Field(ff => ff.Description))) && q.Term(f => f.CompanyGroupId, companyGroupId);
}
原因之一就是复制代码并根据条件添加术语。但我想保持 DRY Principle
。另一种方式是类似于下面的方式,我似乎无法弄清楚。
return q => q
.MultiMatch(m => m
.Query(query)
.Type(TextQueryType.MostFields)
.MinimumShouldMatch("90%")
.Fields(f => f
.Field(ff => ff.FullName, 3)
.Field(ff => ff.Number, 3)
.Field(ff => ff.Email)
.Field(ff => ff.JobNumber)
.Field(ff => ff.Description))) && q.Term(f => f.CompanyGroupId, companyGroupId)
&& !includeTerminationDate ? q.Term(f => f.TerminationDate, null) : 'Otherwise do not include term';
实现此目的的一种方法是将表达式转换为方法组,并有条件地添加查询
private Func<QueryContainerDescriptor<EmployeeDocument>, QueryContainer> EmployeeSearchQuery(string query, long companyGroupId, bool includeTerminationDate)
{
return q =>
{
var qc = q.MultiMatch(m => m
.Query(query)
.Type(TextQueryType.MostFields)
.MinimumShouldMatch("90%")
.Fields(f => f
.Field(ff => ff.FullName, 3)
.Field(ff => ff.Number, 3)
.Field(ff => ff.Email)
.Field(ff => ff.JobNumber)
.Field(ff => ff.Description))) &&
q.Term(f => f.CompanyGroupId, companyGroupId);
// whatever your logic is for adding termination date
if (includeTerminationDate)
qc &= q.Term(f => f.TerminationDate, DateTime.UtcNow);
return qc;
};
}
然后使用
client.Search<EmployeeDocument>(s => s
.Query(EmployeeSearchQuery("query", 2, false))
);
发出
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"type": "most_fields",
"query": "query",
"minimum_should_match": "90%",
"fields": [
"fullName^3",
"number^3",
"email",
"jobNumber",
"description"
]
}
},
{
"term": {
"companyGroupId": {
"value": 2
}
}
}
]
}
}
}
和
client.Search<EmployeeDocument>(s => s
.Query(EmployeeSearchQuery("query", 2, true))
);
发出
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"type": "most_fields",
"query": "query",
"minimum_should_match": "90%",
"fields": [
"fullName^3",
"number^3",
"email",
"jobNumber",
"description"
]
}
},
{
"term": {
"companyGroupId": {
"value": 2
}
}
},
{
"term": {
"terminationDate": {
"value": "2018-05-16T23:21:16.8309753Z"
}
}
}
]
}
}
}