新网站怎样做优化,织梦网站301跳转怎么做,网站开发外包 合同,wordpress 内容模板下载一 背景
要求es查询的结果按关键字位置排序#xff0c;位置越靠前优先级越高。
es版本7.14.0#xff0c;项目是thrift#xff0c;也可以平替springboot#xff0c;使用easyes连接es。 二 easyes使用
配easyes按官方文档就差不多了
排序 | Easy-Es 主要的一个问题是easy…一 背景
要求es查询的结果按关键字位置排序位置越靠前优先级越高。
es版本7.14.0项目是thrift也可以平替springboot使用easyes连接es。 二 easyes使用
配easyes按官方文档就差不多了
排序 | Easy-Es 主要的一个问题是easyes有与mybatis相同的一套mapper如果项目也用了mybatis那需要将mybatis、easyes的mapper分成两个目录
见避坑指南 | Easy-Es 还有实体类的主键按ee官方推荐是留个没注解的id自动生成id而不是指定自己生成的主键因为会影响数据储存的分区导致查询效率降低 具体查询config、mapper、实体类略 // 查询构造LambdaEsQueryWrapperEsSearchDocument listWrapper new LambdaEsQueryWrapper();
// 查询条件相等listWrapper.eq(EsSearchDocument::getType, searchType);
// 查询条件模糊与上条是and关系listWrapper.like(EsSearchDocument::getTitle, searchContent);
// 分页偏移量计算int offset ((pageNum ! null ? Integer.parseInt(pageNum) : 1) - 1) * size;
//查询总条数Long count esMapper.selectCount(listWrapper);
// 设置分页listWrapper.limit(offset, size); // 分页
// 查询结果列表ListEsSearchDocument esList esMapper.selectList(listWrapper);//打印System.out.println(countcount);System.out.println(JSON.toJSONString(esList)); 三 自定义排序
es官方排序是按重复次数、内容长度、权重之类用一个啥公式算出来分数排的 大学也许还能看懂点现在是完全不懂了 easyes也提供了按字段排序之类见上面官方文档链接 回到问题es、ee都没有按关键字位置排序的。不过es、ee还提供了自定义脚本 painless可以自己写处理方式。那就好说了在脚本里获得字段原文indexof拿到关键字所在位置根据这个值排序。
大部分网上的文档这么写包括文心一言 可以看到取原文的写法是 doc[字段.keyword].value
经过实测会报错
1 字段.keyword 不存在。去掉.keyword能取到但取得是内容片段比如原文“金坷垃好处都有啥”这个word/words值是“都有啥”。
2 text类型字段不能拆出来排序否则报错 Text fields are not optimised for operations that require per-document field data like aggregations 意思就是text类型字段被es禁用了聚合、排序操作要么加注解fielddatatrue才能解锁要么改成keyword类型。但加注解会影响效率有多影响待观察。 这个字段是用了ik分词器的去掉分词器后谨慎改变实体类每次改变都会试es数据清空word值成了“啥”
到这里已经一整天过去了 然后翻阅es的官方文档终于发现这么一句 Field context | Painless Scripting Language [7.14] | Elastic
意思是 doc[字段]写法不适用于text类型字段。想取到原值可以 params[_source][字段]
试了下还真可以。
param是可以传动态参数的使脚本避免反复编译提高效率。另外doc、_source、ctx是结合上下文在不同场景用的比如doc是_search查询用的但这个问题的查询就用了_source不能太死板
探究 | Elasticsearch Painless 脚本 ctx、doc、_source 的区别是什么-腾讯云开发者社区-腾讯云 最后加了这么一段
// 定义脚本String painlessScriptStr String word params[_source][title]; int position (word ! null !.equals(word)) ? word.indexOf(params[searchContent]) : -1; return position; ;// 自定义评分规则Script script new Script(ScriptType.INLINE, painless, painlessScriptStr, Collections.singletonMap(searchContent, searchContent));ScriptSortBuilder ssb new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.ASC);listWrapper.sort(ssb);