我正在尝试使用多字段属性来支持多语言。我为此创建了以下映射:
{
"mappings": {
"product": {
"properties": {
"prod-id": {
"type": "string"
},
"prod-name": {
"type": "string",
"fields": {
"en": {
"type": "string",
"analyzer": "english"
},
"fr": {
"type": "string",
"analyzer": "french"
}
}
}
}
}
}
}
我创建了测试记录:
{
"prod-id": "1234567",
"prod-name": [
"Test product",
"Produit d'essai"
]
}
并尝试使用某种语言进行查询:
{
"query": {
"bool": {
"must": [
{"match": {
"prod-name.en": "Produit"
}}
]
}
}
}
结果我得到了我的文件。但是我希望当我使用法语但是选择英语时,我会得到空的结果。似乎ElasticSearch忽略了我在查询中指定的字段。当我使用“prod-name.en”或“prod-name.fr”或只是“prod-name”时,搜索结果没有区别。这种行为有望吗?我应该用一种语言进行搜索吗?
更新多字段属性的另一个问题。我不能只更新一个字段。
{
"doc" : {
"prod-name.en": "Test"
}
}
我收到了以下错误:
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "Field name [prod-name.en] cannot contain '.'"
}
],
"type": "mapper_parsing_exception",
"reason": "Field name [prod-name.en] cannot contain '.'"
},
"status": 400
}
有没有办法只更新多字段属性中的一个字段?
答案 0 :(得分:3)
在您的映射中,prod-name.en
字段将仅使用english
分析器进行分析,而法语字段则相同。但是,ES不会选择将哪个值放在哪个字段中。
相反,您需要像这样修改映射
{
"mappings": {
"product": {
"properties": {
"prod-id": {
"type": "string"
},
"prod-name": {
"type": "object",
"properties": {
"en": {
"type": "string",
"analyzer": "english"
},
"fr": {
"type": "string",
"analyzer": "french"
}
}
}
}
}
}
}
并输入文档就像这样,你会得到你期望的结果。
{
"prod-id": "1234567",
"prod-name": {
"en": "Test product",
"fr": "Produit d'essai"
}
}
对于更新部分,您的部分文档应该是这样的。
{
"doc" : {
"prod-name": {
"en": "Test"
}
}
}