Как определить динамические шаблоны ElasticSearch?

Я пытаюсь определить динамические шаблоны в 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
      }
   ]
}

Что мне не хватает? :)


person Andy Burton    schedule 14.05.2014    source источник


Ответы (1)


Ваш динамический шаблон определен правильно. Проблема в том, что вам нужно будет проиндексировать документ с полем 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
      }
   ]
}

В индекс должен быть вставлен документ, чтобы он мог выполнить определенный шаблон сопоставления для вставленных полей. Как только это поле появится в индексе и к нему будет применено динамическое сопоставление, вызовы _analyze API будут выполняться должным образом.

person Paige Cook    schedule 14.05.2014