【问题标题】:Nest ElasticSearch adding conditional TermsNest ElasticSearch 添加条件条款
【发布时间】:2018-05-16 10:15:06
【问题描述】:

我正在构建以下查询,请注意过滤companyGroupId 我似乎找不到合适的方法来添加和条件Term

我想检查includeTerminationDate 的值并有条件地添加term

简而言之,如果false 不返回带有终止日期的记录。

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';

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    实现此目的的一种方法是将表达式转换为方法组,并有条件地添加查询

    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"
                }
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 啊,你是怎么做的,我在努力添加条件时没有意识到我可以将其更改为方法组
    • lambdas on lambdas :)
    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多