首页 > 解决方案 > 使用 MultiMatch 的 Elasticsearch / Nest 搜索,所有其他字段的默认提升

问题描述

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

当我不包含任何字段时,所有内容的提升为 1(我们使用的是 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)
                )
            )
        )
    )
);

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

标签: c#elasticsearchnest

解决方案


想通了我的问题。我将多个.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)
        )
    )
);

推荐阅读