ES多字段匹配查询时的权重控制
我们在使用ES进行查询时常常遇到这样的场景:需要根据用户输入的查询关键字同时去匹配多个字段,并且希望对匹配字段的权重做不同的设置,比如同时去匹配公司名称和公司简介,这里一般需要提升公司名称匹配的权重,这样得出的相关性评分才会更准确。在ES中,我们可以通过boost参数来控制多字段查询的权重。
一、场景说明
我们在使用ES进行查询时常常遇到这样的场景:需要根据用户输入的查询关键字同时去匹配多个字段,并且希望对匹配字段的权重做不同的设置,比如同时去匹配公司名称和公司简介,这里一般需要提升公司名称匹配的权重,这样得出的相关性评分才会更准确。
在ES中,我们可以通过boost参数来控制多字段查询的权重。
二、权重参数boost
boost是一个用来修改文档的相关性的参数,默认值是1。可以通过设置不同的值,提升该字段在相关性评分的权重。
boost有两种类型:
- 索引期间boost
- 查询期间boost
创建索引时指定的boost参数是存储在索引中的,修改boost值唯一的方法是重新索引这篇文档。
鉴于此,推荐用户使用查询期间的boost,这样会更加灵活,用户可以在不重新索引数据的前提下改变字段的权 重。
1、索引期间boost
创建索引
说明:
在创建索引的过程中,在mappings中给字段设置boost的值为3,提升company的相关性权重。
PUT my-index-000001
{
"mappings": {
"properties": {
"company": {
"type": "text", "analyzer": "ik_smart", "boost":"3"
},
"desc": {
"type": "text", "analyzer": "ik_smart"
}
}
}
}
添加数据:
PUT my-index-000001/_doc/1
{
"company": "北京京东世纪股份有限公司"
}
PUT my-index-000001/_doc/2
{
"desc": "北京京东世纪股份有限公司"
}
通过multi_match进行多字段匹配查询:
GET my-index-000001/_search
{
"query": {
"multi_match": {
"query": "京东",
"fields": ["company","desc"]
}
}
}
执行结果:
"hits" : [
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.68324494,
"_source" : {
"company" : "北京京东世纪股份有限公司"
}
},
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.2876821,
"_source" : {
"desc" : "北京京东世纪股份有限公司"
}
}
]
结论:
对相同的字段串进行匹配,由于company的权重boost是desc的3倍,最后的相关性得分也高接近3倍。。
2、查询期间boost
DELETE my-index-000001
PUT my-index-000001
{
"mappings": {
"properties": {
"company": {
"type": "text", "analyzer": "ik_smart"
},
"desc": {
"type": "text", "analyzer": "ik_smart"
}
}
}
}
PUT my-index-000001/_doc/1
{
"company": "北京京东世纪股份有限公司"
}
PUT my-index-000001/_doc/2
{
"desc": "北京京东世纪股份有限公司"
}
正常查询,2条记录的得分一样:
GET my-index-000001/_search
{
"query": {
"multi_match": {
"query": "京东",
"fields": ["company","desc"]
}
}
}
提高company字段的权重:
GET my-index-000001/_search
{
"query": {
"multi_match": {
"query": "京东",
"fields": ["company^3","desc"]
}
}
}
说明:
通过字段名称后面添加“^”符号和boost的值,提升指定字段的评分权重。
三、ES java API中权重控制
Map<String,Float> fields = new HashMap(2);
fields.put("company", 3.0f);
fields.put("desc", 1.0f);
queryBuilder.must(QueryBuilders.multiMatchQuery(paramsDto.getKeyword()).fields(fields).analyzer("ik_smart"));
说明:
通过封装fields对象,指定需要匹配的字段和字段的权重boost。
总结
看完本文,你学会了如何通过boost参考提高多字段匹配时的评分权重了吗?
1、权重参数boost的2种用法,创建索引时指定字段的权重以及查询时指定字段权重。
2、在ES java API查询中,如何指定字段的权重参数boost。
更多推荐
所有评论(0)