现在有两个字段:名字和机构,因项目需要,使用的是keyword类型。
name,organizationName
现在设计需要,要按照** 检索词**匹配度进行排序。
比如: 搜索词是 “张三”,
姓名:“张三的名字” (匹配到两个字,就是2,总字数5)
机构:“张三上海张三机构”,(匹配到四个字,就是4,总字数8)
则:2/5x0.8 + 4/8x0.2 这个结果就是这条的分数。
我想使用script painless实现,但是现在问题是es配置不支持正则,连基本的分割字符串split也不能使用。运维应该也不想开这个,影响效率。
想过能否使用java代码结合,但是script脚本中不支持 java代码工具类传参。
能否使用正常的脚本实现该功能?或者其他的解决方案?
使用 script_score 查询,这种方式查询出来的结果是经过脚本计算后得到的分数,然后再按照分数进行排序。
GET index/_search
{
"query": {
"function_score": {
"query": {
"match": {
"name": "张三"
}
},
"script_score": {
"script": {
"source": "double nameMatch = (doc['name'].value.length() - doc['name'].value.replace('张三','').length()) / doc['name'].value.length();double orgMatch = (doc['organizationName'].value.length() - doc['organizationName'].value.replace('张三','').length()) / doc['organizationName'].value.length(); return nameMatch * 0.8 + orgMatch * 0.2;"
}
}
}
}
}
望采纳!!!点击回答右侧采纳即可!!可以在脚本中使用 indexOf() 函数来查找检索词在姓名和机构字段中的出现位置。 然后,你可以使用计算出的匹配字数除以总字数并乘以百分比权重,以计算最终得分。
比如下面这个代码:
def search_term = "张三";
def name_weight = 0.8;
def org_weight = 0.2;
def name_match = doc['name'].value.indexOf(search_term);
def name_length = doc['name'].value.length();
def org_match = doc['organizationName'].value.indexOf(search_term);
def org_length = doc['organizationName'].value
参考实例实现es排序:
https://my.oschina.net/u/3777515/blog/4676712
使用weightFactorFunction方法或者scriptFunction实现
可以使用 Elasticsearch 的 function_score query 来实现自定义排序。
在 function_score query 中使用 script_score 函数,计算出每个文档的得分。
{
"query": {
"function_score": {
"query": {
"match": {
"name": "检索词"
}
},
"script_score": {
"script": {
"source": "double name_match = 0; double org_match = 0; for(int i=0; i<params.name.length(); i++){ if(params.name.charAt(i) == params.search_term.charAt(i)){name_match++;} } for(int i=0; i<params.org.length(); i++){ if(params.org.charAt(i) == params.search_term.charAt(i)){org_match++;} } return name_match/params.name.length()*0.8 + org_match/params.org.length()*0.2;"
}
}
}
}
}
可以在 script 中使用循环来遍历文档的名字和机构,并且计算匹配字数。
请注意,这只是示例代码,实际上需要根据您的实际情况来调整参数和脚本。
如果不能使用 script_score 或您不想在 Elasticsearch 中进行脚本编写,可以考虑将数据预先处理,并在索引时附加额外的得分字段。然后在查询时使用该字段进行排序。