在ElasticSearch中更新和搜索多字段属性

时间:2016-03-11 10:07:36

标签: elasticsearch

我正在尝试使用多字段属性来支持多语言。我为此创建了以下映射:

{
  "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
}

有没有办法只更新多字段属性中的一个字段?

1 个答案:

答案 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"
        }
     }
}