Byr*_*ach 6 java scoring elasticsearch
我一直在讨论这个问题已经有一段时间了,并且无法解决这个问题.
采取以下案例:
我公司有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)
我使用范围过滤器来确保当视图量为0(得分也为0)时field_value_factor不会影响得分.
现在,当我尝试运行此查询时,我将得到以下异常:
nested: ElasticsearchException[Unable to find a field mapper for field [views]]; }]
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为该字段不存在于索引中的任何位置.如果我要添加views = 0
索引时间,我就不会遇到上述问题,因为该字段在索引中是已知的.但在我的用例中,我无法在索引时或映射上添加它.
基于在函数得分查询中使用范围过滤器的能力,我以为我能够使用存在过滤器来确保只有当字段实际存在于索引中时才执行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"
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
仍然给出:
nested: ElasticsearchException[Unable to find a field mapper for field [views]]; }]
Run Code Online (Sandbox Code Playgroud)
在解析field_value_factor之前,我希望Elasticsearch首先应用过滤器.
有关如何解决此问题的任何想法,而不使用映射文件或在索引时或脚本期间修复?
您看到的错误发生在查询解析时,即尚未执行任何操作。此时,FieldValueFactorFunctionParser
构建了filter_value_factor
稍后要执行的函数,但它注意到views
映射类型中不存在该字段。
注意,过滤器还没有被执行,就像filter_value_factor
函数一样,它只是被 解析了FunctionScoreQueryParser
。
我想知道为什么你不能简单地在映射类型中添加一个字段,这就像运行这个一样简单
curl -XPUT 'http://localhost:9200/blog/_mapping/page' -d '{
"page" : {
"properties" : {
"views" : {"type" : "integer"}
}
}
}'
Run Code Online (Sandbox Code Playgroud)
如果这确实不是一个选项,另一种可能性是使用script_score
,如下所示:
{
"query": {
"function_score": {
"query": {
"match": {
"author-title": "developer"
}
},
"functions": [
{
"filter": {
"range": {
"views": {
"from": 1
}
}
},
"script_score": {
"script": "_score * doc.views.value"
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1444 次 |
最近记录: |