【问题标题】:Search multiple fields query_string return no result - ElasticSearch搜索多个字段 query_string 没有返回结果 - ElasticSearch
【发布时间】:2021-03-31 02:29:39
【问题描述】:

我有这个 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")
          )
       )
      )                  
  )
);

但是当我像下面这样只用FirstName 测试它时,它会返回结果。

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

【问题讨论】:

    标签: c# nest


    【解决方案1】:
    • 查询字符串查询根据提供的查询字符串返回文档,使用具有严格语法的解析器。您的第一个 NEST c# 代码强调匹配所有字段,但没有结果。所以你应该添加 MinimumShouldMatch 限制。
    • 您可以在 firstName、surName、middleName 上添加 should 条件。即使匹配了一个名称,它也想返回。
    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)
                    )
                )
            )
        )
    );
    

    【讨论】:

    • 你知道你的解决方案与其他解决方案有什么区别吗?我都试过了,得到了相同的正确结果。
    • @Steve 我的回答只是多字段查询的不同形式。
    【解决方案2】:

    您的问题是使用了Fields 错误。 .Fields().Fields().Fields() 只使用最后一个字段MiddleName ,所以没有响应。 改变你的 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")
                          )
                       )
                     )
                  )
                );
    

    【讨论】:

    • 您知道您的解决方案与其他解决方案有什么不同吗?我都试过了,得到了相同的正确结果。
    • 只是与 KenTsu 所说的不同的查询形式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多