使用MultiMatch进行Elasticsearch / Nest搜索,并为所有其他字段提供默认增强功能

时间:2018-10-03 04:04:16

标签: c# elasticsearch nest

我正在尝试建立一个查询,该查询基本上搜索所有全文本字段,并增强了一些,但将所有其他字段保留为默认增强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)
                )
            )
        )
    )
);

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

1 个答案:

答案 0 :(得分:0)

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