在 Lucene 6.6.0 及更高版本中,不推荐使用字段级索引时间提升。该文件指出:
不推荐使用索引时间提升,请将索引时间评分因素索引到文档值字段中,并在查询时使用例如将它们与分数组合。函数分数查询。
以前会在索引时提升一个字段,如下所示:
Field title = new Field(PaperDAO.LUCENE_FIELD_TITLE, titleStr, fieldType);
title.setBoost(3.00f);
document.add(title);
Field authors = new Field(PaperDAO.LUCENE_FIELD_AUTHOR, StringEscapeUtils.unescapeHtml4(this.getAuthorsForLucene()), fieldType);
authors.setBoost(10.00f);
document.add(authors);
Run Code Online (Sandbox Code Playgroud)
我不明白建议的 FunctionScoreQuery 如何是字段级别提升的合适替代品,因为只有一个现有的 Query 和一个 DoubleValuesSource 表示可能许多字段中的一个的提升值,因此构造了一个 FunctionScoreQuery :
// INDEX TIME
Field title = new Field(PaperDAO.LUCENE_FIELD_TITLE, titleStr, fieldType);
document.add(title);
document.add(new FloatDocValuesField(PaperDAO.LUCENE_FIELD_TITLE + "_boost", 3.00f));
// QUERY TIME
new FunctionScoreQuery(query, DoubleValuesSource.fromFloatField(PaperDAO.LUCENE_FIELD_TITLE + "_boost"))
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下 Lucene >= 6.6.0 中 Field#setBoost @ index time 的适当替换吗?我们是否应该在查询时枚举所有可能的字段并应用相关的提升?如果是这样,该查询是如何构造的?
我正在搜索"产品文档".换句话说,我的solr文档是产品记录.我想说一下查询的前50个匹配产品.然后我希望能够按名称或价格对排名前50的得分文件进行排序.我没有看到如何做到这一点,因为按分数排序,然后按名称或价格排序将不会真正有用,因为分数是浮点数.
我不介意我是否可以做一些事情,比如将得分映射到范围(比如得分为8.0-8.99将进入8桶分数),然后按范围排序,然后按名称排序,但因为基本上没有归一化到得分,这仍然会让事情变得更难.
Tl; dr如何在排序之前从solr结果集中排除低得分文档?
除了在文本内容字段上具有tf-idf相似性的标准术语搜索之外,我还希望基于数字字段的"相似性"进行评分.这种相似性将取决于查询中的值与文档中的值之间的距离(例如,高斯与m = [用户输入],s = 0.5)
也就是说文档代表人,而人文档有两个字段:
我想找到像这样的文件
描述:( xyz)年龄:30岁
但年龄不是过滤器,而是分数的一部分(30岁以上的乘数为1.0,25岁的人为0.8等)
这可以以合理的方式实现吗?
编辑:最后我发现这可以通过使用CustomScoreQuery包装ValueSourceQuery和TermQuery来完成.请参阅下面的解决方案
编辑2:随着快速变化的Lucene版本,我只想补充说它是在Lucene 3.0(Java)上测试的.
我试图根据"喜欢"的数量来订购结果.
最明显的解决方案是为每行设置一个"赞"字段,并为每个点击"喜欢"的用户重新索引文档.但在这种情况下,重新索引大型文档并不实用.
(以下是为了举例:没有涉及大型文件)
理想情况下,我想将Solr中的数据和用户操作索引为单独的行.
的数据行(如下所示)是随时间相对稳定.
id:place_1
title: ela restaurant
meta: sea food, chinese food festival
description: this place...
Run Code Online (Sandbox Code Playgroud)
的动作的行各自用户点击"喜欢"时间插入.
id:action_43141
action:like
user:john
target:place_1
id:action_44323
action:like
user:doe
target:place_1
Run Code Online (Sandbox Code Playgroud)
如果每个喜欢存在于自己的行上,我怎么能根据喜欢的数量来提升结果呢?
我知道即将到来的Solr 4.0中存在连接http://wiki.apache.org/solr/Join.但它会根据匹配的行数改善分数吗?
根据维基百科:
一位科学家指数^ h如果^ h的他/她的Np个论文有至少^ h引用的每个和其他(NP 2 H)的论文不超过^ h每个引用。
想象一下,我们有 SCIENTISTS、PAPERS、CITATIONS 表,SCIENTISTS 和 PAPERS 之间是 1-n 关系,PAPERS 和 CITATION TABLES 之间是 1-n 关系。如何编写一条 SQL 语句来计算 SCIENTISTS 表中每个科学家的 h 分数?
为了展示我在此处所做的一些研究工作,使用 SQL 计算每篇论文的引用次数:
SELECT COUNT(CITATIONS.id) AS citations_count
FROM PAPERS
LEFT OUTER JOIN CITATIONS ON (PAPERS.id = CITATIONS.paper_id)
GROUP BY PAPERS.id
ORDER BY citations_count DESC;
Run Code Online (Sandbox Code Playgroud) 我试图根据历史体育赛事的表现来评估一个模型.
我有一个由以下列组成的数据集:
feature1 | ... | featureX | oddsPlayerA | oddsPlayerB | winner
Run Code Online (Sandbox Code Playgroud)
该模型将进行回归,其中输出是playerA赢得比赛的几率
我的理解是,我可以使用自定义评分函数来返回模型在每次条件为真时下注的"金钱",并使用该值来衡量模型的适应性.条件类似于:
if prediction_player_A_win_odds < oddsPlayerA
money += bet_playerA(oddsPlayerA, winner)
if inverse_odd(prediction_player_A_win_odds) < oddsPlayerB
money += bet_playerB(oddsPlayerB, winner)
Run Code Online (Sandbox Code Playgroud)
在自定义评分函数中,我需要接收通常的参数,如"ground_truth,predictions"(其中ground_truth是获胜者[],预测是prediction_player_A_win_odds []),还有来自数据集的字段"oddsPlayerA"和"oddsPlayerB"(这里)是问题!).
如果使用与原始数据集完全相同的顺序调用自定义评分函数,则从数据集中检索所需的额外数据将是微不足道的.但实际上,当使用交叉验证方法时,它获得的数据全部混淆(与原始数据相比).
我尝试过最明显的方法,即用[oddsA,oddsB,winner](dimension [n,3])传递y变量,但是scikit不允许它.
那么,我如何从数据集中获取数据到自定义评分函数既不是X也不是y,但仍然以相同的顺序"捆绑在一起"?
我对大约80个项目进行了调查,主要是项目是平衡的(更高的分数表示更好的结果),但其中大约20个是负面的平衡,我需要找到一种方法来反转在R中负面平衡的那些.我是完全失去了如何这样做.我绝对是一个R初学者,这可能是一个愚蠢的问题,但是有人能指出我的代码方向吗?
如果多个文档具有相同的分数,是否可以实现elasticsearch搜索结果的可靠分页?
我在弹性搜索中尝试自定义评分.我尝试的许多得分表达式产生结果集,其中许多文档具有相同的分数.每次尝试时它们似乎都以相同的顺序出现,但可以保证吗?
AFAIU它不能,特别是如果集群中有多个分片.具有相同分数的文件.给定的elasticsearch查询以随机,非确定性顺序返回,即使基础数据库不发生更改(因此分页不可靠),也可以在同一查询的调用之间进行更改,除非以下其中一项成立:
function_score
用来保证每个文档的分数是唯一的(例如,通过使用唯一的数字字段).sort
并保证排序定义总顺序(例如,如果其他条件相同则使用唯一字段作为后备).任何人都可以确认(并可能指出一些参考)?
如果我知道只有一个主要分片没有任何副本,这会改变吗(参见其他类似的问题:对于具有相同分数的文档,主/副本的结果排序不一致)?例如,如果我保证有一个分片并且在同一查询的两次调用之间数据库没有变化,那么该查询将以相同的顺序返回结果?
还有什么其他选择(如果有的话)?
我一直在讨论这个问题已经有一段时间了,并且无法解决这个问题.
采取以下案例:
我公司有2名员工,他们有自己的博客页面:
POST blog/page/1
{
"author": "Byron",
"author-title": "Junior Software Developer",
"content" : "My amazing bio"
}
Run Code Online (Sandbox Code Playgroud)
和
POST blog/page/2
{
"author": "Jason",
"author-title": "Senior Software Developer",
"content" : "My amazing bio is better"
}
Run Code Online (Sandbox Code Playgroud)
在他们创建博客文章后,我们希望跟踪他们博客的"观点",并根据他们的"观点"推动搜索结果.
GET blog/_search
{
"query": {
"function_score": {
"query": {
"match": {
"author-title": "developer"
}
},
"functions": [
{
"filter": {
"range": {
"views": {
"from": 1
}
}
},
"field_value_factor": {
"field": "views"
}
}
]
}
}
} …
Run Code Online (Sandbox Code Playgroud) scoring ×10
lucene ×2
python ×2
scikit-learn ×2
solr ×2
algorithm ×1
indexing ×1
java ×1
pagination ×1
r ×1
regression ×1
reverse ×1
sql ×1
tf-idf ×1