搜索多个字段 query_string return 无结果 - ElasticSearch

Search multiple fields query_string return no result - ElasticSearch

我有这个 DSL 查询 return 在 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# 时,return 没有结果。

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

但是当我像下面这样用 FirstName 测试它时,结果是 return。

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))
              .Query("Pibba Fawsu")
          )
       )
      )                  
  )
);
  • 查询字符串根据提供的查询字符串查询 returns 文档,使用具有严格语法的解析器。您的第一个 NEST c# 代码强调匹配所有字段,但没有结果。所以你应该添加 MinimumShouldMatch 限制。
  • 您可以在 firstName、surName、middleName 上添加 should 条件。即使匹配到一个名字,它也想 return.
client.Search<Document>(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.middleName)
                    .Query(keyz)
                ),
                    sh => sh
                .Match(c => c
                    .Field(p => p.surName)
                    .Query(keyz)
                )
            )
        )
    )
);

您的问题是使用了 Fields 错误。 .Fields().Fields().Fields()只用到最后一个FieldMiddleName ,所以没有反应。 更改您的 C# Nest 代码:

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