画像篇之试题画像

试题画像是根据用户做题信息,老师发布试题情况以及收藏点赞等信息抽象出的一个标签化的模型

从静态信息数据和动态数据进行剖析

静态信息数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
试题相对稳定的信息,更多的是数据清洗工作
paper_type:试题类型(填空,单选,多选,试题组,单选组试题,多选组试题)
difficult:老师标记的试题难度
enable:是否有效(逻辑删除)
concat_ws(',',body,resolve):将试题题干,解析,答案以及组试题的内容都合并在一个字段中;用于试题搜索
学段信息:小学,初中,高中
省份,城市,试卷类型,学校,年份:试题根据成卷的信息走,通过成卷和试题的关系;(单元测试如果计算出来的年份小于去年,修正成去年)
年份权重:最近两年的算2,最近四年有小于两年的算1,其他为0
区域权重:有城市的算1,没有城市有省份的为0.5,都没有为0
中高考标记:主要标记出中高考真题和中高考模拟
学科:存储最大的学科id
以list的方式存在:
教材id;教材name,版本id,年级id
share_type:是否校内共享

动态信息数据

1
2
3
4
5
6
7
8
相关信息是随着用户的做题等情况进行动态变化的;根据用户的行为,可以看做试题动态信息的唯一数据来源;对用户行为数据构建数据模型,分析出试题标签
ctt_diff:大数据预测的试题难度
right_rate:正确率
standard_time:试题的标准时长
hot_option: 热门选项
collect_count:试题收藏量
use_count:试题使用量
use_value:试题使用量权重(为null的为0;小于3的为0.5,大于3的为1)

主要用于网校,数校平台的试题搜索功能

1
2
3
4
5
6
7
8
打通数校网校的数据后,进行试题的标记(有标记的为网校),可以直接使用在两个平台上;保证两平台的数据一致性

对返回的数据进行重新打分,并根据省份,城市,年份和使用量进行权限的设置

主要对body和point_name使用text类型,使用multi_match进行多字段匹配,type使用best_field,还可以通过tie_breaker来控制其他field的得分
score=best_field.score*boost.score+other_field*boost.score*tie_breaker


搜索系统之multi_match多字段匹配

1
2
3
4
5
6
7
multi_match多字段匹配的三种类型:best_fields(最佳字段),most_fields(多数字段),cross_fields(跨字段)

1.best_fields:multi_match默认的查询类型,返回某一个字段匹配到最多关键字的文档;一般搭配tie_breaker,将其他匹配的查询子句考虑进来;通过指定tie_breaker参数将其他每个匹配的子句的分值乘以tie_breaker,以达到取得最佳匹配查询子句

2.most_fields:多数字段匹配成功的得分之和,字段匹配越多,得分越高

3.cross_fields:一个唯一标识,跨域多个字段;主要用于名字区域[first_name,last_name]或者[province,city](浙江省杭州市)

kibana相关代码摘取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
GET new_ques_all_profile/_search
{
"size" : 20,
"timeout" : "5s",
"query" : {
"bool" : {
"must" : [
{
"function_score" : {
"query" : {
"bool" : {
"must" : [
{
"multi_match" : {
"query" : "用电场线能很直观",
"fields" : [
"bodys^1.0",
"point_names^1.0"
],
"type" : "best_fields",
"max_expansions" : 50,
"minimum_should_match" : "50%",
"tie_breaker" : 0.9
}
}
]
}
},
"functions" : [
{
"filter" : {
"match_all" : {
"boost" : 1.0
}
},
"script_score" : {
"script" : {
"inline" : "double area = 0.0; if (params.c_id == doc['city_id'].value){area = 1;} if (params.c_id != doc['city_id'].value && params.p_id == doc['province_id'].value){area = 0.5;} Math.log(2+(doc['year_value'].value+ area +doc['use_value'].value))/Math.log(10)",
"lang" : "painless",
"params" : {
"c_id" : null,
"p_id" : null
}
}
}
}
]
}
}
],
"filter" : [
{
"range" : {
"type" : {
"from" : null,
"to" : 7,
"include_lower" : true,
"include_upper" : false,
"boost" : 1.0
}
}
}
]
}
},
"_source" : {
"includes" : [
"question_id",
"right_rate",
"difficult",
"cttdiff",
"use_count",
"collect_count",
"paper_type_id",
"exam_type",
"year",
"sizhong_type",
"type",
"province_names"
],
"excludes" : [ ]
}
}