我们使用 Elasticsearch 作为库搜索界面。我们的问题是在嵌套字段上使用过滤器时为嵌套字段获取正确的聚合数。
我们的映射可以最好地概括为: 一部作品,有零个或多个出版物。为酿造而简化的映射:
{
"work":{
"properties":{
"publication":{
"type":"nested",
"properties":{
"language":{
"type":"string",
"index":"not_analyzed"
},
"format":{
"type":"string",
"index":"not_analyzed"
}
}
},
"mainTitle":{
"type":"string"
},
"partTitle":{
"type":"string"
}
}
}
}
在我们的搜索结果中,我们展示了作品,但我们过滤了他们出版物中的语言和格式。此外,聚合是关于语言和格式的。聚合中的存储桶用于在 Web UI 中向用户显示过滤选项: 图片显示我们的过滤器类别和过滤器
作为参考,这里是一个示例查询,其中启用了格式“Book”和语言“Norwegian”的过滤器:查询
搜索结果是正确的。应用格式“书”和语言“挪威语”只会返回出版物既是书本又是挪威语的作品。应用“书籍”格式以及“挪威语”和“瑞典语”语言将仅返回出版物为挪威语书籍或瑞典语书籍的作品。
问题是聚合数字(显示为过滤器后括号中的数字)不是正确的。正确的行为是这样的:
例如,当应用过滤器“Book”并且您从聚合中返回的是“Finnish (3)”时,那么 3 应该表示工作结果中总共有 3 个出版物是芬兰书籍。
相反,会发生这样的事情:
显示的数字只是芬兰语出版物的数量,但不限于书籍,还可以是其他格式,例如 DVD 或蓝光音频。如果没有芬兰语书籍,用户甚至可能在启用芬兰语过滤器时得到“无结果”。
任何有关如何解决此问题的提示将不胜感激!