我正在尝试使用Solr实现我自己的自定义评分功能 - 我希望Solr做一个KNearestNeighbor并返回得分最高的最接近的结果。
我一直在关注这两个实现external-score-to-solr和using-custom-score-query。
我有多远
在我的架构上,我有以下字段:
<field name="histogram" type="payloads" indexed="true" stored="true" />
具有直方图字段数据的文档示例如下:
"bin1|1.23 bin2|-0.24 bin3|-1.89 bin4|5.21"
按照上面的两个链接,我最终扩展了 CustomScoreProvider 类,我的 customScore 功能是:
@Override
public float customScore(int doc, float subQueryScore, float valSrcScores[]) throws IOException {
Document d = context.reader().document(doc);
String histogram = d.get("histogram");
// Here I have a function that splits the string by space and then parse
// each name and value
Map<<String, Float> histogramMap = getDocumentHistogram(histogram);
// A similar function but for the query terms. Can be done only once
// query is the type of org.apache.lucene.search.Query
Map<<String, Float> queryMap = getQueryHistogram(query.toString());
// Trivial function to compute KNN
float score = computeScore(histogramMap, queryMap);
return 1/score;
}
问题
我所做的工作,但正如您在实现中看到的那样,性能不佳,因为对于每个查询,我需要在计算分数之前解析这些功能。我只能解析查询术语一次,但我仍然需要解析每个文档的直方图才能计算得分。
那么,有没有办法获得 customScore 函数中已解析的直方图功能的列表/数组/地图/等?此字段类型为有效负载,它使用带有管道的 WhitespaceTokenizerFactory 标记生成器作为分隔符,因此应该有一种方法可以返回每个人的solr术语
我可以提供更多有关我所做的事情的细节,而且我正在使用Solr 6.0.1。
谢谢, 塞尔吉奥
答案 0 :(得分:0)
分析直方图时,将为文档建立索引并将其添加到索引中。 这样您就可以在排名过程中使用索引字段。