Elasticsearch NEST с условием Where

Я пытаюсь MultiMatch выполнить поиск с условием. Я знаю, что подобные вопросы задавались раньше, но не с использованием NEST. Это мой текущий поиск, он хорошо работает по всему документу

 var response = await this.client.SearchAsync<EmployeeDocument>(
                               x => x.Index(this.settings.IndexName).Type("employee").From(page * pageSize)
                                   .Size(pageSize).Query(
                                       q => q.MultiMatch(m => m
                                                .Query(query)
                                                .Type(TextQueryType.MostFields)
                                                .MinimumShouldMatch("90%")
                                                .Fields(f => f
                                                    .Field(_ => _.FullName, 3)
                                                    .Field(_ => _.Number, 3)
                                                    .Field(_ => _.Email)
                                                    .Field(_ => _.CompanyName, 2)
                                                    .Field(_ => _.JobNumber)
                                                    .Field(_ => _.Description))))
                    .Highlight(
                        h => h.PreTags("<mark>").PostTags("</mark>")
                            .Fields(
                                f => f.Field(p => p.FullName),
                                f => f.Field(p => p.CompanyName),
                                f => f.Field(p => p.JobNumber),
                                f => f.Field(p => p.Number),
                                f => f.Field(p => p.Email),
                                f => f.Field(p => p.Description))));

Как я могу добавить условие, чтобы искать только определенное поле? (CompanyId)

Так, например, приведенный выше код выполняет поиск сотрудников, но ему нужно искать только внутри конкретной компании.

Это то, что я пробовал

var response = await this.client.SearchAsync<EmployeeDocument>(
                               x => x.Index(this.settings.IndexName).Type("employee").From(page * pageSize)
                                   .Size(pageSize).Query(
                                       q => q.MultiMatch(m => m
                                                .Query(query)
                                                .Type(TextQueryType.MostFields)
                                                .MinimumShouldMatch("90%")
                                                .Fields(f => f
                                                    .Field(_ => _.FullName, 3)
                                                    .Field(_ => _.Number, 3)
                                                    .Field(_ => _.Email)
                                                    .Field(_ => _.CompanyName, 2)
                                                    .Field(_ => _.JobNumber)
                                                    .Field(_ => _.Description))))
                           .Query(_ => _.Bool(b => b.Must(descriptor =>
                                       descriptor.Term(t => 
t.Field(document => document.CompanyGroupId).Value(4213))))) // I ADDED THIS SECTION HERE
                    .Highlight(
                        h => h.PreTags("<mark>").PostTags("</mark>")
                            .Fields(
                                f => f.Field(p => p.FullName),
                                f => f.Field(p => p.CompanyName),
                                f => f.Field(p => p.JobNumber),
                                f => f.Field(p => p.Number),
                                f => f.Field(p => p.Email),
                                f => f.Field(p => p.Description))));

Я добавил дополнительный запрос для выполнения условия bool, но мне кажется, что я не вернул правильный результат. Но я уверен, что мой NEST запрос неверен


person R4nc1d    schedule 06.12.2017    source источник


Ответы (1)


Вы хотите создать bool запрос с предложениями must и filter. Использование перегрузки оператора по запросам это можно выразить лаконичнее

var query = "query";
var page = 1;
var pageSize = 10;

var searchResponse = client.Search<EmployeeDocument>(x => x
    .Index("indexName")
    .Type("employee")
    .From(page * pageSize)
    .Size(pageSize)
    .Query(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.CompanyName, 2)
                .Field(ff => ff.JobNumber)
                .Field(ff => ff.Description)
            )
        ) && +q
        .Term(f => f.CompanyGroupId, 4213)
    )
    .Highlight(h => h
        .PreTags("<mark>")
        .PostTags("</mark>")
        .Fields(
            f => f.Field(p => p.FullName),
            f => f.Field(p => p.CompanyName),
            f => f.Field(p => p.JobNumber),
            f => f.Field(p => p.Number),
            f => f.Field(p => p.Email),
            f => f.Field(p => p.Description)
        )
    )
);

что дает следующий запрос

{
  "from": 10,
  "size": 10,
  "highlight": {
    "pre_tags": [
      "<mark>"
    ],
    "post_tags": [
      "</mark>"
    ],
    "fields": {
      "fullName": {},
      "companyName": {},
      "jobNumber": {},
      "number": {},
      "email": {},
      "description": {}
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "type": "most_fields",
            "query": "query",
            "minimum_should_match": "90%",
            "fields": [
              "fullName^3",
              "number^3",
              "email",
              "companyName^2",
              "jobNumber",
              "description"
            ]
          }
        }
      ],
      "filter": [
        {
          "term": {
            "companyGroupId": {
              "value": 4213
            }
          }
        }
      ]
    }
  }
}
person Russ Cam    schedule 06.12.2017
comment
Отлично, позволь мне быстро взглянуть - person R4nc1d; 06.12.2017