Elasticsearch function_score 打分源代码跟踪

类注册器 IndicesModule

private void registerBuiltinQueryParsers() {
        registerQueryParser(MatchQueryParser.class);
        registerQueryParser(MultiMatchQueryParser.class);
        registerQueryParser(NestedQueryParser.class);
        registerQueryParser(HasChildQueryParser.class);
        registerQueryParser(HasParentQueryParser.class);
        registerQueryParser(DisMaxQueryParser.class);
        registerQueryParser(IdsQueryParser.class);
        registerQueryParser(MatchAllQueryParser.class);
        registerQueryParser(QueryStringQueryParser.class);
        registerQueryParser(BoostingQueryParser.class);
        registerQueryParser(BoolQueryParser.class);
        registerQueryParser(TermQueryParser.class);
        registerQueryParser(TermsQueryParser.class);
        registerQueryParser(FuzzyQueryParser.class);
        registerQueryParser(RegexpQueryParser.class);
        registerQueryParser(RangeQueryParser.class);
        registerQueryParser(PrefixQueryParser.class);
        registerQueryParser(WildcardQueryParser.class);
        registerQueryParser(FilteredQueryParser.class);
        registerQueryParser(ConstantScoreQueryParser.class);
        registerQueryParser(SpanTermQueryParser.class);
        registerQueryParser(SpanNotQueryParser.class);
        registerQueryParser(SpanWithinQueryParser.class);
        registerQueryParser(SpanContainingQueryParser.class);
        registerQueryParser(FieldMaskingSpanQueryParser.class);
        registerQueryParser(SpanFirstQueryParser.class);
        registerQueryParser(SpanNearQueryParser.class);
        registerQueryParser(SpanOrQueryParser.class);
        registerQueryParser(MoreLikeThisQueryParser.class);
        registerQueryParser(WrapperQueryParser.class);
        registerQueryParser(IndicesQueryParser.class);
        registerQueryParser(CommonTermsQueryParser.class);
        registerQueryParser(SpanMultiTermQueryParser.class);

        registerQueryParser(FunctionScoreQueryParser.class);
        //注意此处

        if (ShapesAvailability.JTS_AVAILABLE) {
            registerQueryParser(GeoShapeQueryParser.class);
        }
    }

调用分析器 FunctionScoreQueryParser

@Override
    public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
         ...
        // handle cases where only one score function and no filter was
        // provided. In this case we create a FunctionScoreQuery.
        if (filterFunctions.size() == 0 || filterFunctions.size() == 1 && (filterFunctions.get(0).filter == null || Queries.isConstantMatchAllQuery(filterFunctions.get(0).filter))) {
            ScoreFunction function = filterFunctions.size() == 0 ? null : filterFunctions.get(0).function;
            FunctionScoreQuery theQuery = new FunctionScoreQuery(query, function, minScore);
            if (combineFunction != null) {
                theQuery.setCombineFunction(combineFunction);
            }
            theQuery.setBoost(boost);
            theQuery.setMaxBoost(maxBoost);
            return theQuery;
            // in all other cases we create a FiltersFunctionScoreQuery.
        } else {
            FiltersFunctionScoreQuery functionScoreQuery = new FiltersFunctionScoreQuery(query, scoreMode,
                    filterFunctions.toArray(new FiltersFunctionScoreQuery.FilterFunction[filterFunctions.size()]), maxBoost, minScore);
            if (combineFunction != null) {
                functionScoreQuery.setCombineFunction(combineFunction);
            }
            functionScoreQuery.setBoost(boost);
            return functionScoreQuery;
        }
    }

其中 FunctionScoreQuery theQuery = new FunctionScoreQuery(query, function, minScore); 会调用 类FunctionScoreQuery

调用下面代码

接着调用 ScriptScoreFunction类的

接着调用NativeScriptEngineService 类的

这里会自定义的打分插件进行编译 缓存 并保存实例, 自定义插件样例如下

CombineScript 会处理一下参数和重写run方法。

而上面的截图里的
double result = leafScript.runAsDouble(); 会调用此run方法,将最终的得分返回给上层调用。

原文地址:http://blog.51cto.com/12597095/2173941

时间: 2024-08-01 04:19:32

Elasticsearch function_score 打分源代码跟踪的相关文章

elasticsearch相关性打分背后的理论

说明:elasticsearch查询结果是根据什么排序的呢?答案是根据相关性得分的高低来排序,本篇着重说明elasticsearch打分机制背后的理论. 主要是翻译自elasticsearch官方文档,官方文档地址如下: 相关性打分背后的理论:https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html 相关性打分权重修正图解:https://www.elastic.co/guide/en/elas

elasticsearch 自定义打分

curl -XGET 'http://localhost:9200/searchsuggestion/searchsuggestion/_search?pretty' -d '{ "fields" : ["company_full_name","id"], "size" : 10, "query": { "function_score": { "functions":

elasticsearch 打分精度

elasticsearch 原文 What Is Relevance?edit We've mentioned that, by default, results are returned in descending order of relevance. But what is relevance? How is it calculated? The relevance score of each document is represented by a positive floating-p

Python 和 Elasticsearch 构建简易搜索

Python 和 Elasticsearch 构建简易搜索 作者:白宁超 2019年5月24日17:22:41 导读:件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如果从一种操作系统里面运行另一种操作系统,通常我们采取的策略就是引入虚拟机,比如在 Windows 系统里面运行 Linux 系统.这种方式有个很大的缺点就是资源占用多.冗余步骤多.启动慢.目前最流行的 Linux 容器解决方案之一就是Docker,它最大优点就是轻量.资源占用少.

MonkeyRunner源代码分析之启动

在工作中由于要追求完毕目标的效率,所以很多其它是强调实战.注重招式.关注怎么去用各种框架来实现目的.可是假设一味仅仅是注重招式.缺少对原理这个内功的了解,相信自己非常难对各种框架有更深入的理解. 从几个月前開始接触ios和android的自己主动化測试.原来是本着只为了提高測试团队工作效率的心态先行作浅尝即止式的研究,然后交给測试团队去边实现边自己研究.最后由于各种原因果然是浅尝然后就止步了,而自己终于也离开了上一家公司. 换了工作这段时间抛开全部杂念和曾经的困扰专心去学习研究各个框架的使用,逐

ElasticSearch评分分析 explian 解释和一些查询理解

ElasticSearch评分分析 explian 解释和一些查询理解 按照es-ik分析器安装了ik分词器.然后创建了一个索引用来演示,创建索引:PUT /index_ik_test.索引的结构如下: GET index_ik_test/_mapping { "index_ik_test": { "mappings": { "fulltext": { "properties": { "content":

Elasticsearch(7) --- 复合查询

Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max(最佳匹配查询).function_score(函数查询). 一.bool query(布尔查询) 1.概念 定义 可以理解成通过布尔逻辑将较小的查询组合成较大的查询. Bool查询语法有以下特点 子查询可以任意顺序出现 可以嵌套多个查询,包括bool查询 如果bool查询中没有must条件,shou

深入理解TCP协议及其源代码——三次握手

Wireshark分析报文 对TCP三次握手过程进行抓包分析,并通过Wireshark的Analyze分析出tcp握手过程,通过截图体现传输内容. 1.捕获大量的由本地主机到远程服务器的TCP分组: 2.浏览追踪信息 在显示筛选规则编辑框中输入“tcp”,可以看到在本地主机和服务器之间传输的一系列tcp和HTTP消息,你应该能看到包含SYN Segment的三次握手.通过Analyze的Follow TCP Stream分析出传输内容.写出其中某TCP数据包的源IP地址,目的IP地址,源端口,目

原创:史上对BM25模型最全面最深刻的解读以及lucene排序深入讲解(佟学强)

垂直搜索结果的优化包括对搜索结果的控制和排序优化两方面,其中排序又是重中之重.本文将全面深入探讨垂直搜索的排序模型的演化过程,最后推导出BM25模型的排序.然后将演示如何修改lucene的排序源代码,下一篇将深入解读目前比较火热的机器学习排序在垂直搜索中的应用.文章的结构如下: 一.VSM模型简单介绍: 二.lucene默认的评分公式介绍: 三.概率语言模型中的二元独立模型BIM介绍: 四.BM25介绍: 五.lucene中的edismax解析器介绍以及评分公式源代码介绍: 六.修改排序源代码: