使用 MultiMatch 的 Elasticsearch / Nest 搜索,所有其他字段默认提升

Elasticsearch / Nest search using MultiMatch with default boosting for all other fields

我正在尝试构建一个基本上搜索所有全文字段的查询,提升一些,但将所有其他保留为默认提升 1。

当我不包含任何字段时,所有内容都会提升 1(我们使用的是支持 default when no fields are specified 的版本 6.4.2):

var results = await _ElasticClient.SearchAsync<dynamic>(s => s
    .Query(q => q
        .MultiMatch(m => m
            .Query(request.Query)
        )
    )
);

但是,一旦我尝试提升单个字段,它就会删除所有其他字段的默认值,只搜索显式字段:

var results = await _ElasticClient.SearchAsync<dynamic>(s => s
    .Query(q => q
        .MultiMatch(m => m
            .Fields(f => f.Field("firstName^20"))
            .Query(request.Query)
        )
    )
);

我尝试添加一个通配符,但这仍然只匹配 firstName(话又说回来,通配符本身不匹配任何东西,所以假设我的语法有误):

var results = await _ElasticClient.SearchAsync<dynamic>(s => s
    .Query(q => q
        .MultiMatch(m => m
            .Fields(f => f.Field("*.*^1"))
            .Fields(f => f.Field("firstName^20"))
            .Query(request.Query)
        )
    )
);

我也试过 Bool 将它们放在一起,但这也只匹配 firstName:

var results = await _ElasticClient.SearchAsync<dynamic>(s => s
    .Query(q => q
        .Bool(b => b
            .Should(m => m
                .MultiMatch(mm => mm
                    .Query(request.Query)
                )
            )
            .Should(m => m
                .MultiMatch(mm => mm
                    .Fields(f => f.Field("firstName^20"))
                    .Query(request.Query)
                )
            )
        )
    )
);

我开始认为这是不可能的。对于上下文,我尝试这样做的原因是能够将其他全文字段添加到索引中,而不必在我们的查询中包含每个字段,但仍然能够增加某些字段。

解决了我的问题。我将多个 .Fields() (复数)链接在一起,我应该只有一个 .Fields() (复数)然后将多个 .Field() (单数)链接在一起:

var results = await _ElasticClient.SearchAsync<dynamic>(s => s
    .Query(q => q
        .MultiMatch(m => m
            .Fields(f => f
                .Field("firstName^20")
                .Field("*.*^1")
            )
            .Query(request.Query)
        )
    )
);