C# 搜索多个字段查询字符串不返回结果-ElasticSearch

C# 搜索多个字段查询字符串不返回结果-ElasticSearch,c#,nest,C#,Nest,我有这个DSL查询,它在ElasticSearch控制台中返回结果 GET /person/_search { "query": { "bool": { "must": [ { "query_string": { "fields": [ "nameDetails.name.na

我有这个DSL查询,它在ElasticSearch控制台中返回结果

GET /person/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "fields": [
              "nameDetails.name.nameValue.firstName",
              "nameDetails.name.nameValue.surname",
              "nameDetails.name.nameValue.middleName"
            ],
            "query": "Pibba Fawsu~"
          }
        }
      ]
    }
  }
}
结果如下:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 10.335077,
    "hits" : [
      {
        "_index" : "person",
        "_type" : "_doc",
        "_id" : "70002",
        "_score" : 10.335077,
        "_source" : {
          "gender" : "Male",
          "nameDetails" : {
            "name" : [
              {
                "nameValue" : {
                  "firstName" : "Fawsu",
                  "middleName" : "L.",
                  "surname" : "Pibba"
                },
                "nameType" : "Primary Name"
              },
              {
                "nameValue" : {
                  "firstName" : "Fausu",
                  "middleName" : "L.",
                  "surname" : "Pibba"
                },
                "nameType" : "Spelling Variation"
              }
            ]
          }          
        }
      }
    ]
  }
}
但是当我将查询转换为NEST C#时,它不会返回任何结果

var response = await _elasticClient.SearchAsync<Person>(s => s
  .Index("person")
  .Query(q => q
      .Bool(b => b
          .Must(                      
            mu => mu
          .QueryString(m => m
              .Fields(f => f.Field(f => f.NameDetails.Name[0].NameValue.FirstName))
              .Fields(f => f.Field(f => f.NameDetails.Name[0].NameValue.Surname))
              .Fields(f => f.Field(f => f.NameDetails.Name[0].NameValue.MiddleName))
              .Query("Pibba Fawsu")
          )
       )
      )                  
  )
);
  • 查询字符串查询使用语法严格的解析器,基于提供的查询字符串返回文档。您的第一个嵌套c#代码强调匹配所有字段,但没有结果。因此,您应该添加MinimumShouldMatch限制
  • 您可以在名字、姓氏、中间名上添加“应该”条件。即使有一个名称匹配,它也会返回
client.Search(s=>s
.Query(q=>q
.Bool(b=>b
.Should(sh=>sh
.Match(c=>c
.Field(p=>p.firstName)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.Field(p=>p.name)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.字段(p=>p.姓氏)
.Query(keyz)
)
)
)
)
);
  • 查询字符串查询使用语法严格的解析器,基于提供的查询字符串返回文档。您的第一个嵌套c#代码强调匹配所有字段,但没有结果。因此,您应该添加MinimumShouldMatch限制
  • 您可以在名字、姓氏、中间名上添加“应该”条件。即使有一个名称匹配,它也会返回
client.Search(s=>s
.Query(q=>q
.Bool(b=>b
.Should(sh=>sh
.Match(c=>c
.Field(p=>p.firstName)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.Field(p=>p.name)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.字段(p=>p.姓氏)
.Query(keyz)
)
)
)
)
);

您的问题在于所使用的
字段
错误。
.Fields().Fields().Fields()
仅使用最后一个字段
MiddleName
,因此没有响应。 更改您的C#嵌套代码:

var response = await client.SearchAsync<Person>(s => s.Index("person")
              .Query(q => q
                  .Bool(b => b
                      .Must(
                        mu => mu
                      .QueryString(m => m
                          .Fields(f => f.Fields(f => f.NameDetails.Name[0].NameValue.FirstName, f => f.NameDetails.Name[0].NameValue.Surname, f => f.NameDetails.Name[0].NameValue.MiddleName))
                          .Query("Pibba Fawsu")
                      )
                   )
                 )
              )
            );
var response=wait client.SearchAsync(s=>s.Index(“person”)
.Query(q=>q
.Bool(b=>b
.必须(
mu=>mu
.QueryString(m=>m
.Fields(f=>f.Fields(f=>f.NameDetails.Name[0].NameValue.FirstName,f=>f.NameDetails.Name[0].NameValue.nameName,f=>f.NameDetails.Name[0].NameValue.MiddleName))
.Query(“Pibba Fawsu”)
)
)
)
)
);

您的问题在于所使用的
字段
错误。
.Fields().Fields().Fields()
仅使用最后一个字段
MiddleName
,因此没有响应。 更改您的C#嵌套代码:

var response = await client.SearchAsync<Person>(s => s.Index("person")
              .Query(q => q
                  .Bool(b => b
                      .Must(
                        mu => mu
                      .QueryString(m => m
                          .Fields(f => f.Fields(f => f.NameDetails.Name[0].NameValue.FirstName, f => f.NameDetails.Name[0].NameValue.Surname, f => f.NameDetails.Name[0].NameValue.MiddleName))
                          .Query("Pibba Fawsu")
                      )
                   )
                 )
              )
            );
var response=wait client.SearchAsync(s=>s.Index(“person”)
.Query(q=>q
.Bool(b=>b
.必须(
mu=>mu
.QueryString(m=>m
.Fields(f=>f.Fields(f=>f.NameDetails.Name[0].NameValue.FirstName,f=>f.NameDetails.Name[0].NameValue.nameName,f=>f.NameDetails.Name[0].NameValue.MiddleName))
.Query(“Pibba Fawsu”)
)
)
)
)
);

u知道您的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。正如KenTsu所说的,只是一个不同的查询表单。你知道你的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。正如KenTsu所说的,只是一个不同的查询表单。你知道你的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。@Steve我的答案只是一种不同形式的多文件查询。你知道你的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。@Steve我的答案只是一种不同形式的多文件查询。
var response = await client.SearchAsync<Person>(s => s.Index("person")
              .Query(q => q
                  .Bool(b => b
                      .Must(
                        mu => mu
                      .QueryString(m => m
                          .Fields(f => f.Fields(f => f.NameDetails.Name[0].NameValue.FirstName, f => f.NameDetails.Name[0].NameValue.Surname, f => f.NameDetails.Name[0].NameValue.MiddleName))
                          .Query("Pibba Fawsu")
                      )
                   )
                 )
              )
            );