Elasticsearch function_score 打分源代码跟踪

网友投稿 303 2022-11-12

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

调用下面代码

接着调用NativeScriptEngineService 类的

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

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何查看linux下进程状态
下一篇:Java多线程教程之如何利用Future实现携带结果的任务
相关文章

 发表评论

暂时没有评论,来抢沙发吧~