c# - 使用 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)
)
)
)
)
);
我开始认为这是不可能的。对于上下文,我尝试这样做的原因是能够将其他全文字段添加到索引中,而不必在我们的查询中包含每个字段,但仍然能够提升某些字段。
解决方案
想通了我的问题。我将多个.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)
)
)
);
推荐阅读
- timeline - Pepper 右肩间距不会在时间轴 IR 检查员中响应
- java - 将列表项从 html 表保存到 Mysql
- spring-boot - FF4j Web 控制台未正确显示
- php - 如何在 PHP 中将 3D (PSD2) 安全支付认证与 PayPal 集成
- android - 如何在 StaggeredGridLayout 中自定义放置项目?
- java - Google Ads API 提供的预测指标与网络 UI 中的预测指标完全不同
- sql - 是否可以找出用于在 SQL SERVER CLR 中加载程序集的原始路径?
- publish-subscribe - apache beam PubSub 在普通 pubsub 客户端库中读取 withIdAttribute 的替代方案
- c# - 使用 lambda 根据楼层数格式化我的字符串
- xaml - Blend For Visual Studio 2019 中缺少资源选项卡