ElasticSearch 命中提升

ElasticSearch Hitboosting

我正在寻找一种方法来对搜索结果执行某种类型的点击率提升,以便点击更频繁的结果在列表中显示得更靠前。

我正在考虑将文档存储在不同的索引中(例如“click_statistics”,每次有人点击结果时,存储一个新文档,其中 _id 的搜索结果被点击作为字段。这似乎是一种合适的方式,它可以帮助我在重新索引主索引时保持统计信息。(如果您有任何其他建议,请分享)

但我不知道如何结合第二个索引的计数,然后将基于该计数的某种评分包含到搜索中。

您可以执行此操作的一种方法是在每个文档中包含一个包含点击次数的字段,并使用 function_score query with a field_value_factor function 根据点击次数的某些函数进行评分

public class MyDocument
{
    public long Clicks { get; set; } 
}

var response = client.Search<MyDocument>(s => s
    .Query(q => q
        .FunctionScore(fs => fs
            .Query(fq => fq
                // your search query here
                .MatchAll()
            )
            .Functions(fun => fun
                // boost by a factor of the square root of the click value 
                // for documents with clicks greater than 0
                .FieldValueFactor(fvf => fvf
                    .Field(f => f.Clicks)
                    .Filter(fi => fi
                        .Range(r => r
                            .Field(rf => rf.Clicks)
                            .GreaterThan(0)
                        )
                    )
                    .Factor(1.5)
                    .Modifier(FieldValueFactorModifier.SquareRoot)
                )
            )
            .ScoreMode(FunctionScoreMode.Multiply)
        )
    )
);

如果您想汇总和分析点击统计信息,那么最好将它们也存储在索引中。

根据点击频率,最好不要在每次点击时更新文档的点击计数;也许每小时、每天、每周、在安静的时间(如果有的话)等更新它们是有意义的。您可以使用点击统计索引和 terms aggregation on the clicked document id field to get the counts of clicks for each document in your chosen timeframe, then use the bulk API 来更新搜索索引中所有被点击的文档.