阅读文档后,在stackoverflow上测试并阅读了很多其他问题:
我们的文档包含多种语言的标题和说明。还有一些标签被翻译成相同的语言。系统中最多可能有30-40种不同的语言,但单个文档可能只有3或4种翻译。
这是计划的文件结构:
{
"luck": {
"id": 10018,
"pub": 0,
"pr": 100002,
"loc": {
"lat": 42.7,
"lon": 84.2
},
"t": [
{
"lang": "en-analyzer",
"title": "Forest",
"desc": "A lot of trees.",
"tags": [
"Wood",
"Nature",
"Green Mouvement"
]
},
{
"lang": "fr-analyzer",
"title": "Forêt",
"desc": "A grand nombre d'arbre.",
"tags": [
"Bois",
"Nature",
"Mouvement Vert"
]
}
],
"dates": [
"2014-01-01T20:00",
"2014-06-06T20:00",
"2014-08-08T20:00"
]
}
}
可能的查询是“arbre”或“wood”或“forest”或“nature”与日期和geo_distance过滤器相结合,而且标签数组上会有一些方面(显然包括计数)。
我们可以生成最适合elasticsearch(或lucene)的文档结构。具体分析每种语言至关重要,因此我们使用“_analyzer”来区分语言。
{
"luck": {
"properties": {
"id": {
"type": "long"
},
"pub": {
"type": "long"
},
"pr": {
"type": "long"
},
"loc": {
"type": "geo_point"
},
"t": {
"_analyzer": {
"path": "t.lang"
},
"properties": {
"lang": {
"type": "string"
},
"properties": {
"title": {
"type": "string"
},
"desc": {
"type": "string"
},
"tags": {
"type": "string"
}
}
}
}
}
}
A)显然,这个想法不起作用:在PUTting映射之后,我们检索相同的映射(“GET”)并且它似乎忽略了特定的分析器(具有顶级“_analyzer”的测试工作正常) 。 “_analyzer”是否适用于子文档,如果是,我们应该如何引用它?我们还测试了将子文档声明为“对象”或“嵌套”。多语言文档索引应该如何工作。
B)一种可能性是将每种语言都放在自己的文档中:在这种情况下,我们如何管理id?最后两个文件都应该引用相同的id。例如,如果用户搜索“自然”(并且我们不知道用户是否打算用英语或法语找到“自然”),则该文档将在结果集中出现两次,并且计数和分页将非常错(也是小计数)。
有什么想法吗?