在Elasticsearch中,我可以设置特定于语言的多字段吗?

时间:2018-01-30 16:58:24

标签: elasticsearch multilingual full-text-indexing

是否可以使用多字段来设置和查询多语言字段?

考虑这种映射:

PUT multi_test
{
  "mappings": {
    "data": {
      "_field_names": {
        "enabled": false
      },
      "properties": {
        "book_title": {
          "type": "text",
          "fields": {
            "english": {
              "type": "text",
              "analyzer": "english"
            },
            "german": {
              "type": "text",
              "analyzer": "german"
            },
            "italian": {
              "type": "text",
              "analyzer": "italian"
            }
          }
        }
      }
    }
  }
}

我尝试了以下操作,但它不起作用:

PUT multi_test/data/1
{
  "book_title.english": "It's good",
  "book_title.german": "Das gut"
}

错误似乎表明我正在尝试添加新字段:

  

{“error”:{“root_cause”:[{“type”:“mapper_parsing_exception”,   “reason”:“无法为字段动态添加映射   [book_title.english]。 [book_title]的现有映射必须是   键入对象但找到[text]。“}],”type“:   “mapper_parsing_exception”,“reason”:“无法动态添加   字段[book_title.english]的映射。现有的映射   [book_title]必须是object类型,但找到[text]。“},”status“:   400}

我在这里做错了什么?

如果我的方法不可行,那么更好的方法是什么?

1 个答案:

答案 0 :(得分:1)

问题是您正在使用字段book_title 的字段。

  • 当您希望以多种方式保留相同的字段和数据时使用Fields关键字,即使用不同的分析器或其他一些设置更改,但字段下的所有字段名称中的值应相同。这是描述关键字字段的链接{ {3}}

在您的用例中,映射应如下所示

PUT multi_test

{
  "mappings": {
    "data": {
      "_field_names": {
        "enabled": false
      },
      "properties": {
        "book_title": {
          "properties": {
            "english": {
              "type": "text",
              "analyzer": "english"
            },
            "german": {
              "type": "text",
              "analyzer": "german"
            },
            "italian": {
              "type": "text",
              "analyzer": "italian"
            }
          }
        }
      }
    }
  }
}

这会将book_title定义为对象类型,您可以在book_title下添加多个具有不同数据的字段