Elasticsearch function_score 打分源代碼跟蹤
阿新 • • 發佈:2018-09-11
red 註意 span not get 編譯 toa regex tex 類註冊器 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方法,將最終的得分返回給上層調用。
Elasticsearch function_score 打分源代碼跟蹤