1、文档匹配
文档评分因素
- 文档加权:对文档建立索引时,对文档的加权值
- 字段加权:查询和索引时,对字段的加权值
- 协调:基于文档词条数的协调因子
- 逆文档频率:基于词条的因子,告诉评分公式,给定词条出现的频率有多低。逆文档频率越高,词条越罕见。
- 长度规范:基于字段的规范化因子,它基于给定字段包含的词条数。字段越长,该因子给的加权值越小。
- 词频:基于词条的因子,描述文档中给定词条的出现次数。词频越高,文档得分越高。
- 查询规范:基于查询的规范化因子。由每个查询词条的权重的平方之和计算得到。
默认评分公式:
2、脚本
es默认是使用painless language
支持的语言有
painless | 内置的。 |
expression | 内置的。快速自定义排名及打分 |
mustache | 内置的。用于模板 |
java | 需要自己实现相关功能 |
使用方式为
"script": {
"lang": "...",
"source" | "id": "...",
"params": { ... }
}
2.1 访问文档字段
根据脚本使用情况,是更新还是查询。
2.1.1 更新脚本
ctx._source | 访问文档的_source字段 |
ctx.op | 应用于文档的操作:index或者delete |
ctx._index(例子) | 访问文档的元数据 |
2.1.2 查询或者聚合
doc['field_name'] | 通过doc获取字段值。默认是开启了适用于除去没有分析的文本类型的所有字段。仅能返回简单字段值(数值、日期、geo-points,term或者数组),不能返回json对象。如果field_name不存在,会抛出异常,可以使用doc.containsKey('field_name')来检查。对于分析的text字段,如果字段数据是开启的,doc['field_name']也可以使用,但是对于text字段使能要求加载所有的词条到jvm堆中,会消耗大量的内存及cpu,所以脚本上访问text字段意义不大。 |
_source.field_name | 是作为map-of-maps加载的,可以获取嵌套属性。推荐使用doc,因为访问_source比doc慢。 |
_fields['field_name'].value或者_fields['field_name'] | 只有在mapping中字段显示设置store为true的才可以通过这种方式来访问。 |
2.2 添加、查询脚本
添加脚本使用POST _scripts/{id}。消息体中需要指定语言脚本语言类型
POST _scripts/calculate-score
{
"script": {
"lang": "painless",
"source": "Math.log(_score * 2) + params['my_modifier']"
}
}
查询脚本使用GET _scripts/{id}
3、多语言查询
主要依赖于mapping中的fields参数
"fields": {
"english": {
"type": "string",
"index": "analyzed",
"analyzer": "english"
},
"russian": {
"type": "string",
"index": "analyzed",
"analyzer": "russian"
},
"german": {
"type": "string",
"index": "analyzed",
"analyzer": "german"
}
}
4、查询加权
4.1 在查询中添加加权
- 在query_string中的fields参数中的元素添加 ^num
- 在term查询的字段下添加boost参数
4.2 修改评分
- 使用constant_score查询
- 使用boosting查询
- 使用function_score查询
5、同义词
5.1 配置同义词
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [ "synonym" ]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "analysis/synonym.txt"
}
}
}
}
}
}
6、理解解释信息
6.1 理解字段分析
使用_analyze的rest api
6.2 解释查询
使用_explain的rest api