当前位置: 首页 > 后端技术 > PHP

Elasticsearch根据匹配标签的数量对查询

时间:2023-03-29 20:30:28 PHP

进行优先级排序。有相似度匹配的需求,匹配标签的数量需要优先排序。在这种情况下,需要自定义查询语句。让我们从代码开始。这里我使用的是PHP的数组结构。最后提交的时候会转成json格式。我们暂时不显示它:'query'=>['script_score'=>["query"=>[],'script'=>['source'=>'defmatches=0;for(tinparams.tags){if(doc["tags"].contains(t)){匹配+=1;}}返回_score*匹配*匹配;',"params"=>["tags"=>$tags,],]],]首先最外层数组就是我们平时写的查询语句,放在body中去请求,主要看查询中的结构,这需要自定义脚本来处理评分。query中只放了一个script_score:script_score包含两部分,一部分是query,另一部分是customscript。里面查询正常。外层查询本来写的查询结构,怎么写还是怎么写,比如可能有tag匹配,所以继续加一个term去查询。然后看脚本部分,分为两个东西:source自定义评分脚本params自定义评分脚本参数先看params,这里我传了$tags,是一个标签数组,最终会在source中调用,source部分会放到elasticsearch里面编译,形成一个类似函数的东西,然后params就是一个参数。源码中需要调用参数tags,使用params.tags来调用。再看源码部分,这里会检查搜索到的结果doc中的tags字段(doc中的tags也是一个数组),并与预期的tags进行比较,最后得到实际的匹配数:matches.最后看源码中的return部分,这里会返回打分结果,其中_score是搜索自己计算出来的相似度分数,然后这个地方_score*matches*matches,这里是用tag的个数来放大评分结果,tags匹配的数据越多,自然放大的结果越大。例如:匹配文档_score标签号结果按照文档A4021602和文档B3032701的位置排序。可以看出最终结果受tag的影响较大,tag结果的数量优先。当然,对于放大形式,比如分数是一样的,标签数量优先,所以不需要对标签进行平方,可以根据具体情况处理自己想要的放大结果.另外在文末贴出elasticsearch的脚本语法链接:https://www.elastic.co/guide/...