【发布时间】:2016-12-06 18:20:16
【问题描述】:
我选择嵌套文档来实现多语言书籍搜索,文档根目录中的常用书籍数据和嵌套文档中的版本数据。映射:
{
"book": {
"properties": {
"bookinfo": {
...
},
"editions": {
"type": "nested",
"properties": {
"editionid": {
"type": "long",
"store": "yes",
"index": "no"
},
"title_author": {
"type": "string",
"store": "no",
"index": "analyzed"
},
"title": {
"type": "string",
"store": "yes",
"index": "not_analyzed"
},
"languageid": {
"type": "short",
"store": "yes",
"index": "no"
},
"ratings": {
"type": "integer",
"store": "no"
}
}
}
}
}
}
嵌套文档中包含一本书的不同版本——可以是不同的语言,也可以是不同的出版商、isbn 等。有时甚至标题也与同一种语言的版本不同。
在搜索文档时(在 title_author 字段上),我需要知道其他嵌套文档信息,如语言 ID 和评级,以根据用户的语言技能和版本的相关性提高匹配分数。
我不将每个版本都放在单独的文档中的原因是我只想每本书有一个热门(最匹配的一个)。而且 ElasticSearch 没有独特的功能。我需要分页。因此,每当我在使用双书查询后更改结果集时,ElasticSearch 的分页就会中断。
嵌套排序功能在这里似乎没有帮助,因为它对一本书的所有嵌套文档进行排序。
如何访问匹配的嵌套文档的信息?
如果这无法实现,我该如何通过多重搜索来解决这个问题?
【问题讨论】:
-
以下可能有帮助,但我不完全确定(我自己没用过
top-children)elasticsearch.org/guide/en/elasticsearch/reference/current/… -
据我了解,
top-children查询只提供了所有匹配子项的汇总信息,而不是最佳匹配子项的信息。 -
这更像是一种解决方法,但现在我这样解决了:我创建了第二个索引,其中只有包含 bookid 的版本。现在我在第一步中只获取与书籍相关的信息,而不知道匹配的版本。在第二步中,我使用 bookid 上的过滤器和 1 的限制(大小)搜索 editions 索引,以获得每次点击的最佳匹配版本。我在多重搜索中提出了所有需要的版本请求 (elasticsearch.org/guide/en/elasticsearch/reference/current/…) 它慢了很多,但我找到了最好的。
标签: sorting elasticsearch nested