Nest ElasticSearch добавление условных условий - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий запрос, который я создаю, обратите внимание, что для фильтрации на 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';

1 Ответ

0 голосов
/ 17 мая 2018

Один из способов добиться этого - преобразовать выражение в группу методов и условно добавить запрос

.
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))
);

1007 * излучает *

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