ES多字段匹配查询时的权重控制

简介: ES多字段匹配查询时的权重控制

一、场景说明


我们在使用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"]
    }
  }
}


84.png

提高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。

目录
相关文章
|
自然语言处理 索引
ES 匹配多个搜索条件和精确查询
ES 匹配多个搜索条件和精确查询
|
2月前
|
负载均衡 应用服务中间件 API
location` 块的语法、匹配规则、配置示例及其应用场景
location` 块的语法、匹配规则、配置示例及其应用场景
25 2
|
2月前
|
SQL 安全 数据挖掘
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
Elasticsearch聚合查询用于复杂数据分析,包括统计空值率。示例展示了如何计算字段`my_field`非空非零文档的百分比。查询分为三步:总文档数计数、符合条件文档数计数及计算百分比。聚合概念涵盖度量、桶和管道聚合。脚本在聚合中用于动态计算。常见聚合类型如`sum`、`avg`、`date_histogram`等。组合使用可实现多值统计、嵌套聚合和空值率计算。[阅读更多](https://zhangfeidezhu.com/?p=515)
164 0
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
|
自然语言处理 索引
ES中如何对text字段进行精确匹配
ES中如何对text字段进行精确匹配
920 0
es聚合查询并且返回对应组的数据
es聚合查询并且返回对应组的数据
419 0
|
3月前
|
关系型数据库 分布式数据库 PolarDB
使用 PolarDB 开源版 bloom filter index 实现任意字段组合条件过滤
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍使用 PolarDB 开源版 bloom filter index 实现任...
100 0
ES复杂操作-精确查询多个值和高亮显示
ES复杂操作-精确查询多个值和高亮显示
|
关系型数据库 MySQL
ES复杂操作-布尔值查询(多条件精确查询)
ES复杂操作-布尔值查询(多条件精确查询)
|
存储 SQL 并行计算
使用 PolarDB 开源版 bloom filter index 实现任意字段组合条件过滤
PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. 本文将介绍使用 PolarDB 开源版 bloom filter index 实现任意字段组合条件过滤
257 0
|
自然语言处理 Java
如何使用ES更有效率的进行多字段模糊匹配
如何使用ES更有效率的进行多字段模糊匹配