一、簡介
ElasticsearchBoost是elasticsearch的一個插件,主要提供了一些新的函數,可以根據相關度評分進行查詢結果排序。
二、安裝
使用elasticsearch plugin命令進行安裝:
bin/elasticsearch-plugin install https://github.com/MLnick/elasticsearch-boost/releases/download/v6.4.2/elasticsearch-six-boost-plugin-6.4.2.zip
三、使用方法
1. scripted_boost函數
首先實例化一個搜索查詢請求,添加查詢條件:
QueryBuilder query = QueryBuilders.matchQuery("title", "elasticsearch");
使用scripted_boost函數添加腳本查詢條件,函數參數中分別為es中文檔的每一項、腳本、參數:
Script script = new Script( "Math.log(doc['page_views'].value + 1) * params.boost_factor", ScriptService.ScriptType.INLINE, "painless", Collections.singletonMap("boost_factor", 2) ); QueryBuilder builder = QueryBuilders.functionScoreQuery(query, new ScriptScoreFunctionBuilder(script));
2.文檔優先函數
使用文檔優先函數可以將給定的文檔排在搜索結果的前部分,使用如下代碼:
// 定義id值列表,指出想要排在前面的文檔id List docIds = Arrays.asList("1", "3", "5"); QueryBuilder query = QueryBuilders.matchAllQuery(); QueryBuilder builder = QueryBuilders.functionScoreQuery(query, ScoreFunctionBuilders.weightFactorFunction(10), ScoreFunctionBuilders.fieldValueFactorFunction("id").modifier(FieldValueFactorFunction.Modifier.LOG2P).missing(1).modifier(FieldValueFactorFunction.Modifier.LN1P), ScoreFunctionBuilders.decayFunction("gaussian", "create_time", "7d")); // 將rule改為指定的文檔id列表 String rule = String.join("; ", docIds.stream().map(id -> String.format("doc['id'].value == %s ? 2 : 0", id)).collect(Collectors.toList())); Script script = new Script("_score + " + rule, ScriptService.ScriptType.INLINE, "painless", ImmutableMap.of()); builder.boostMode(CombineFunction.MULTIPLY).add(ScoreFunctionBuilders.scriptFunction(script));
3.隨機函數
使用隨機函數可以在很多情況下為搜索結果添加一定的隨機性,提高搜索的體驗。
QueryBuilder builder = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.randomFunction());
4.權重係數函數
使用權重係數函數可以將某一字段的值進行調整,改變該字段對搜索結果的權重影響。
QueryBuilder builder = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.fieldValueFactorFunction("score").modifier(FieldValueFactorFunction.Modifier.LOG2P));
四、優化建議
1.使用ElasticsearchBoost插件前請先進行官方文檔的學習,並在實際使用前進行反覆實驗。
2.對於不同數據類型的字段,需要選擇不同的評分函數進行匹配。
3.在使用文檔優先函數時,請注意保證id值的唯一性,否則可能出現錯誤。
4.實現全文檢索業務時儘可能地選用先進技術,但應避免過分依賴技術。
原創文章,作者:ZVVVA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/366022.html