【问题标题】:Elasticsearch NEST with Where condition带有 Where 条件的 Elasticsearch NEST
【发布时间】:2017-12-06 08:36:26
【问题描述】:

我正在尝试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 查询是错误的

【问题讨论】:

    标签: elasticsearch nest elasticsearch-5


    【解决方案1】:

    您想使用mustfilter 子句构造bool 查询。在查询上使用operator overloading,这样可以更简洁地表达

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

    【讨论】:

    • 厉害,快让我看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多