我一直在讨论这个问题已经有一段时间了,并且无法解决这个问题.
采取以下案例:
我公司有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" }
在他们创建博客文章后,我们希望跟踪他们博客的"观点",并根据他们的"观点"推动搜索结果.
这可以通过使用功能分数查询来完成:
GET blog/_search { "query": { "function_score": { "query": { "match": { "author-title": "developer" } }, "functions": [ { "filter": { "range": { "views": { "from": 1 } } }, "field_value_factor": { "field": "views" } } ] } } }
我使用范围过滤器来确保当视图量为0(得分也为0)时field_value_factor不会影响得分.
现在,当我尝试运行此查询时,我将得到以下异常:
nested: ElasticsearchException[Unable to find a field mapper for field [views]]; }]
这是有道理的,因为该字段不存在于索引中的任何位置.如果我要添加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" } } ] } } }
仍然给出:
nested: ElasticsearchException[Unable to find a field mapper for field [views]]; }]
在解析field_value_factor之前,我希望Elasticsearch首先应用过滤器.
有关如何解决此问题的任何想法,而不使用映射文件或在索引时或脚本期间修复?