目录
计算文档的评分属性时,考虑如下因素:
从上述讨论中得到:
elasticsearch使用脚本执行的任何请求中,一些可能使用到的相似的属性:
script:包含实际执行的脚本
lang:脚本的语言信息
params:包含参数和值,每个定义的参数都可以在脚本中使用,由于缓存,使用参数的脚本比嵌入常数的代码执行更快
_doc: 它是org.elasticsearch.search.lookup.DocLookup对象的实例。通过它可以访问当前找到的文档,附带计算的得分和字段的值
_source:是org.elasticsearch.search.lookup.SourceLookup对象的实例,通过它可以访问当前文档的_source
_fields:是org.elasticsearch.search.lookup.FieldsLookup对象的实例,通过它可以访问文档的所有字段
另一方面,在文档更新过程中,Elasticsearch只通过_source属性公开了ctx对象,通过它可以访问当前文档。
当访问文档中的字段时,上述三种方式都可以,_doc可以更快的访问到分析的字段,_souce可以更快的访问字段的原始值。
小脚本应该定义成文件,放在Elasticsearch的config/scripts目录中。使用方式如下:
{
"query":{
"match_all":{
}
},
"sort":{
"_script":{
"script":"sort_script",
"type":"text",
"order":"asc"
}
}
}
script属性值直接调用我们自定义脚本的名字。
如果对脚本语言执行速度不满意,可以编写elasticsearch插件,插件应该放在lib目录下,并且使用Setting API或者在yml配置文件中注册
思路:
使用语言检测库检测文档使用的语言,或者由用户将语言信息存放在文档的一个字段中
定义索引映射时,根据语言字段设置分析器
{
"mappings":{
"indextype":{
"_analyzer":{
"path":"lang"
},
"properties":{
"lang":{
"type":"keywords",
"index":"not_analyzed"
}
}
}
}
}
lang字段的值是Elasticsearch知道的分析器的名字相同的值。
加权适用于下列地方:
query:给定查询是复杂查询的一部分,且比其他部分更重要
field:重要字段的加权
{
"query":{
"query_string":{
"fields":[
"from^5",
"to^10",
"subject"
],
"query":"john"
}
}
}
假定一个索引含有from,to,subject三个字段,现在搜索john,以上查询将生成3个小查询,最后组合结果,to字段权重最大,from字段次之。
{
"query":{
"function_score":{
"query":{
},
"filter":{
},
"functions":[
{
"filter":{
},
"FUNCTION":{
}
}
],
"boost_mode":"",
"score_mode":"",
"max_boost":"",
"boost":""
}
}
}
一般来说,function_score查询中可以使用查询、过滤、函数和附加参数。每个函数可以有一个过滤器定义要应用的过滤结果。
function_score背后的逻辑是首先匹配文档基于score_mode参数计算得分,然后,文档的查询得分由函数计算所得分数结合而成,结合基于boost_mode参数。
boost_mode定义如何将函数查询所计算分数与查询分数结合起来。取值如下
score_mode定义函数计算得分如何结合在一起,取值如下:
function节点中的可用函数如下:
查询加权尽管很强大,但是如果在建立文档的时候就知道哪些字段重要,可以在索引时加权,这样效率也更高。
索引加权既可以通过在插入数据的时候实现,也可以在定义映射的时候加权。
过滤器的类型属性(type)设置为synonym,synonyms属性包括同义词如"crime=>criminality";如果同义词是一个文件,并且在config目录下,则可以通过synonym_path设置
手机扫一扫
移动阅读更方便
你可能感兴趣的文章