1

我正在尝试在 Elastic Search 中定义动态模板,以自动为当前未定义的翻译属性设置分析器。

例如,以下正是我想要的,即设置 lang.en.title 以使用英语分析器:

PUT /cl 
{
    "mappings" : {
        "titles" : {
            "properties" : {
                "id" : {
                    "type" : "integer",
                    "index" : "not_analyzed"
                },
                "lang" : {
                    "type" : "object",
                    "properties" : {
                        "en" : {
                            "type" : "object",
                            "properties" : {
                                "title" : {
                                        "type" : "string",
                                        "index" : "analyzed",
                                        "analyzer" : "english"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

正如预期的那样,它源于 lang.en.title,例如

GET /cl/_analyze?field=lang.en.title&text=knocked

{
   "tokens": [
      {
         "token": "knock",
         "start_offset": 0,
         "end_offset": 7,
         "type": "<ALPHANUM>",
         "position": 1
      }
   ]
}

但我想要做的是设置 lang.en 的所有未来字符串属性,以使用使用动态模板的英语分析器,我似乎无法开始工作......

PUT /cl 
{
    "mappings" : {
        "titles" : {
            "dynamic_templates" : [{
                "lang_en" : {
                    "path_match" : "lang.en.*",
                    "mapping" : {
                        "type" : "string",
                        "index" : "analyzed",
                        "analyzer" : "english"
                    }
                }
            }],`enter code here`
            "properties" : {
                "id" : {
                    "type" : "integer",
                    "index" : "not_analyzed"
                },
                "lang" : {
                    "type" : "object"
                }
            }
        }
    }
}

英语分析器没有被应用,因为 lang.en.title 没有按要求进行词干 -

GET /cl/_analyze?field=lang.en.title&text=knocked

{
   "tokens": [
      {
         "token": "knocked",
         "start_offset": 0,
         "end_offset": 7,
         "type": "<ALPHANUM>",
         "position": 1
      }
   ]
}

我错过了什么?:)

4

1 回答 1

3

您的动态模板定义正确。问题是您需要lang.en.title在动态模板应用适当的映射之前为包含该字段的文档编制索引。我在本地运行了您在上面的问题中定义的相同动态映射,并得到了与您相同的结果。

但是,然后我将单个文档添加到索引中。

POST /cl/titles/1
{
    "lang.en.title": "Knocked out"
}

添加文档后,我再次运行分析器,得到了预期的输出:

GET /cl/_analyze?field=lang.en.title&text=knocked

{
   "tokens": [
      {
         "token": "knock",
         "start_offset": 0,
         "end_offset": 7,
         "type": "<ALPHANUM>",
         "position": 1
      }
   ]
}

索引需要插入一个文档,以便它可以为插入的字段执行定义的映射模板。一旦该字段存在于索引中并应用了动态映射,_analyzeAPI 调用将按预期执行。

于 2014-05-14T11:47:57.457 回答