【发布时间】:2015-02-01 03:57:12
【问题描述】:
我已经在这个问题上搞砸了很长一段时间,无法解决这个问题。
举个例子:
我的公司有 2 名员工,他们有自己的博客页面:
POST blog/page/1
{
"author": "Byron",
"author-title": "Junior Software Developer",
"content" : "My amazing bio"
}
和
POST blog/page/2
{
"author": "Jason",
"author-title": "Senior Software Developer",
"content" : "My amazing bio is better"
}
在他们创建博客帖子后,我们希望跟踪他们博客的“浏览量”,并根据他们的“浏览量”提升搜索结果。
这可以通过使用function score query:来完成
GET blog/_search
{
"query": {
"function_score": {
"query": {
"match": {
"author-title": "developer"
}
},
"functions": [
{
"filter": {
"range": {
"views": {
"from": 1
}
}
},
"field_value_factor": {
"field": "views"
}
}
]
}
}
}
我使用范围过滤器来确保 field_value_factor 在观看次数为 0 时不会影响得分(得分也会为 0)。
现在当我尝试运行这个查询时,我会得到以下异常:
nested: ElasticsearchException[Unable to find a field mapper for field [views]]; }]
这是有道理的,因为该字段在索引中的任何位置都不存在。
如果我要在索引时间添加views = 0,我不会遇到上述问题,因为该字段在索引中是已知的。但在我的用例中,我无法在索引时间或映射中添加它。
基于在函数分数查询中使用范围过滤器的能力,我认为我可以使用exists filter 来确保 field_value_factor 部分仅在该字段实际存在于索引中时才被执行,但没有这样的运气:
GET blog/_search
{
"query": {
"function_score": {
"query": {
"match": {
"author-title": "developer"
}
},
"functions": [
{
"filter": {
"bool": {
"must": [
{
"exists": {
"field": "views"
}
},
{
"range": {
"views": {
"from": 1
}
}
}
]
}
},
"field_value_factor": {
"field": "views"
}
}
]
}
}
}
仍然给出:
nested: ElasticsearchException[Unable to find a field mapper for field [views]]; }]
我希望 Elasticsearch 在解析 field_value_factor 之前先应用过滤器。
关于如何在不使用映射文件或在索引时间或脚本期间修复的情况下解决此问题有什么想法吗??
【问题讨论】:
-
我现在遇到了同样的问题。你找到解决方案了吗?
标签: java elasticsearch scoring