ElasticSearch的查询权重-控制查询相关度

这篇具有很好参考价值的文章主要介绍了ElasticSearch的查询权重-控制查询相关度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES查询相关度的官网连接

1:ElasticSearch的查询权重

每个文档与查询的相关度,在全文搜索引擎中不仅需要找到匹配的文档,还需根据它们相关度的高低进行排序。

根据全文相关的公式或 相似算法(similarity algorithms) 会将多个因素合并起来,为每个文档生成一个相关度评分 _score 。_score 在查询结果中有显示

1:相关度评分理论

Lucene(或 Elasticsearch)使用 bool(bool model) 查找匹配文档时,会用一个名为 实用评分函数的公式来计算相关度。这个公式借鉴了 词频/逆向文档频率 和 向量空间模型,同时也加入了一些现代的新特性,如协调因子(coordination factor),字段长度归一化(field length normalization),以及词或查询语句权重提升。

1.1:bool模型

bool 查询可以接受 must 、 must_not 和 should 参数下的多个查询语句,就是and,or,not的意思
下面展示一些 内联代码片

{    
"bool" : {     
   "must" :     [],      
   "should" :   [],      
   "must_not" : [],   
   		} 
}

1.2:词频

也就是查询值在一个字段中出现的次数。当然也可以禁用词频统计: “index_options”: “docs”

 "match": {
            "title": {
              "query": "quick brown fox",
               "index_options": "docs" 
}            }

1.3:字段长度归一值

字段长度归一值就是查询值在结果中所占长度的比例。占的越多值越大
对于 not_analyzed 字符串字段的归一值默认是禁用的,而对于 analyzed 字段也可以通过修改字段映射禁用归一值:禁用"norms": { “enabled”: false }

 "match": {
            "title": {
              "query": "quick brown fox",
               "index_options": "docs""norms": { "enabled": false } 
}            }

2:查询时提升相关度

2.1:boost权重

我们可以用boost 参数设置不同字段配置查询时的权重。

1:提升权重

给boost参数不同的值,比如1,5,10

 "match": {
            "title": {
              "query": "quick brown fox",
              "boost": 2             //使用boost权重设置为2,不设置的默认是1
}            }

2:对多索引提升权重

当在多个索引中搜索时,可以使用参数 indices_boost 来提升整个索引的权重

get index */search{
"indices_boost": { 
    "index1": 3,
    "index2": 2
  }
  "query":{} 
}

2.2:词频统计配置

当我们不关心检索词频率TF对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包装起来。我们仍然可以用boost给与权重
当然也可以禁用词频统计: “index_options”: “docs”

{
    "query":{
        "bool":{
            "should": [
                { "constant_score": {
                	  "boost":2,
                      "query": { "match": { "description": "wifi" }} }},
                { "constant_score": {
                      "query": { "match": { "description": "garden" }} }},
                { "constant_score": {
                      "query": { "match": { "description": "pool" }} }}
              ]
        }
    }
}

2.3:查询结果评分修改:function_score

es提供了一些函数允许我们对查询的结果score评分进行修改,function_score 查询将查询query和函数function包括在内。在搜索时,可以将 function_score 查询与 field_value_factor 结合使用

field_value_factor :配置字段,最终的查询的score会由function_score 查询体的结果值通过field_value_factor配置字段的值进行协调。多用于点赞排名等数据。最终值:new_score=old_score*field_value_factor

GET /blogposts/post/_search
{
  "query": {
    "function_score": { 
      "query": {                   	//function_scored的查询体
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "functions": [              	//function_score的functions函数
          {"random_score": {}},    	//functions函数的参数1:随机评分
          {"gauss": {					//functions函数的参数2:gauss中心化展示
       		 "age": {  
          		"origin": "2",
          		"scale": "1"
        		}
     	 	}
        ],
      "field_value_factor": { 		//function_score参数1
        "field": "votes"            //该字段必须是integer等数值类型的数据,常用于点赞数等字段评分  
      },
      "boost_mode": "sum",			//function_score参数2
      "max_boost":  1.5 			//function_score参数3
    }
  }
}

1:field_value_factor参数解释
field:提取该字段的值乘以query的查询score评分=最终结果,相等于我们给每个查询的结果乘了值的系数
modifier :为了让最终结果减少field值系数的影响。
missing:如果文档没有该字段,则使用该值
factor:对于field字段值的均衡使用后new_score = old_score * log(1 + factor * field-value)

"field_value_factor": { 
        "field": "interger field"  ,  //该字段必须是integer等数值类型的数据,常用于点赞数等字段评分  
     	"modifier ":"none ", 		  //none (默认状态)、 log 、 log1p 、 log2p 、 ln 、 ln1p 、 ln2p 、 square 、 sqrt 以及 reciprocal
     	"missing": 1"factor":  1
      }

2:max_boost最大值限制

限制field_value_factor 的最大值,只会对函数的最大值有用,不会对不在函数内的查询构成作用

3:随机评分制:random_score

当_score评分结果一致时保证每次的展示结果都一致。 通过random_score设置值

 "functions": [  
		{
          "random_score": { 
            "seed":  "the users session id"  //常用用户id等保证每个人的结果一致
          }
        }
 ]

4:查询结果中心化:gauss

为了保证查询结果是我们想要的,我们可以设定距离,价格等为中心查询某一范围的值。让更合适的值靠近我们的展示。比如美团的展示(以价格,距离排序展示)

"functions": [
      {"gauss": {      
        "age": {        //以哪个字段的值进行计算
          "origin": "2",	//该字段的中心值
           "offset": "",  	//以origin左右偏移多少为中心 :origin±offset  该范围内是1.0评分
          "scale": "1"		//偏出origin±offset到scale值内的评分默认是origin±offset评分值的一半0.5
        }
      }"weight ":2}         //该函数的权重系数
 ]

3:相似度算法

在设置索引的mapping时为字段配置属性
“similarity”: “BM25”文章来源地址https://www.toymoban.com/news/detail-702069.html

2:实战验证

2.1:插入数据

2.2:验证

到了这里,关于ElasticSearch的查询权重-控制查询相关度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 原生语言操作和spring data中RestHighLevelClient操作Elasticsearch,索引,文档的基本操作,es的高级查询.查询结果处理. 数据聚合.相关性系数打分

    ​ Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasti

    2024年02月05日
    浏览(80)
  • 「Elasticsearch 」Es复合查询

    目录 Bool 查询   Dis_max 查询  Function_score 查询 Nested 查询  Geospatial 查询  1. Geo Point 查询 2. Geo Shape 查询 Elasticsearch(简称为ES)是一个基于Lucene的分布式搜索和分析引擎,它提供了丰富的查询语言和API,可以用于构建高性能、可扩展的全文搜索、日志分析和数据可视化等应用

    2024年02月13日
    浏览(36)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(113)
  • 【ElasticSearch笔记】ES基本查询

    目录 一、简介 ES与关系型数据库对比 文本分析 倒排索引 二、基本查询 空查询 相关性 查询与过滤 1. 查询与\\\"first blog\\\"字段最佳匹配的文档 2. 搜索博客等级(level)大于等于2, 同时发布日期(post_date)是2018-11-11的博客 结构化搜索 1. 精确值查找(term) 2. 多个精确值查找(terms) 3

    2024年01月21日
    浏览(36)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(58)
  • ES-ElasticSearch查询命令

    根据条件查询符合标准的doc文档,需要使用更进阶的查询方式,在ES中一般采用请求体格式通过**_search**来进行查询,query子句主要用于编写查询条件,类似SQL中的where语句。 通过 match 实现全文搜索,如果 fieldname 字段的数据类型是 text类型 ,搜索 querytext 会进行 分词处

    2024年02月11日
    浏览(33)
  • elasticsearch(es)高级查询api

    在以上示例代码中,定义了一个返回类型为ResponseEntityMapString, Object的/search POST映射方法,并使用MapString, Object对象来存储异步操作的结果。然后,创建了一个ActionListener的匿名实现对象,并使用client.searchAsync()方法以异步方式执行搜索操作。在onResponse()方法中,将搜索结果存储

    2023年04月09日
    浏览(41)
  • 【ES】Elasticsearch 常见的简单查询

    查看es中有哪些索引 请求方式:GET 请求地址: http://localhost:9200 /_cat/indices?v 参数:无 结果: 查看索引全部数据 请求方式:GET 请求地址:http://localhost:9200/index-2023-08/_search 参数: 结果:  查询多1个数据 请求方式:GET 请求地址:http://localhost:9200/index-2023-08/_search 解释:http:

    2024年02月07日
    浏览(40)
  • 【elasticsearch】ES去重查询实现

    去重实现原理: 采用es 的Collapse折叠+cardinality基数计算 实现去重 1、优点:简单快速效率高,几乎无性能损耗(相比于分桶去重) 2、缺点: 1)Collapse折叠只支持一个字段去重,且字段必须是 keyword 2)cardinality基数计算去重后数量 (采用hyperloglog实现,hyperloglog一种近似计算)

    2024年02月06日
    浏览(38)
  • 推出 Elasticsearch 查询语言 (ES|QL)

    作者:Costin Leau 我很高兴地宣布,经过大约一年的开发,Elasticsearch 查询语言 (ES|QL) 已准备好与世界共享,并已登陆 Elasticsearch 存储库。 ES|QL 是 Elasticsearch® 原生的强大声明性语言,专为可组合性、表现力和速度而设计。 Elasticsearch 支持多种语言,从古老的 queryDSL 到 EQL、KQ

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包