使用 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)
)
)
);
我正在尝试构建一个基本上搜索所有全文字段的查询,提升一些,但将所有其他保留为默认提升 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)
)
)
);