Как добавить нормализатор нижнего регистра к объекту сопоставления Elasticsearch в определенном поле?

#node.js #elasticsearch

#node.js #elasticsearch

Вопрос:

У меня есть схема, опубликованная в эластичном файле, и я хочу знать, возможно ли добавить нормализатор нижнего регистра при публикации индекса, чтобы обновить это поле и избежать определения нового объекта схемы со всеми старыми полями и новым.

В настоящее время я пытаюсь обновить это поле с помощью этой команды:

 await this.getClient().indices.putSettings({index: indexName, body:{ 
  softwarePublisher: {
    type: "text",
    fields: {
      ngram: {
        type: "text",
        analyzer: "software_analyzer",
        search_analyzer: "software_search_analyzer",
      },
      raw: {
        type: "keyword",
      },
      rawl: {
        type: "keyword",
        normalizer: "lowercase_normalizer",
      },
    },
  },
}});
 

Но я получил следующую ошибку:

{«ошибка»: {«root_cause»:[{«type»:»illegal_argument_exception»,»причина»: «неизвестная настройка [index.softwarePublisher.fields.ngram.analyzer] пожалуйста, проверьте, установлены ли какие-либо необходимые плагины, или проверьте документацию по последним изменениям для удаленных настроек»}],»type»:»illegal_argument_exception»,»reason»: «неизвестная настройка [index.softwarePublisher.fields.ngram.analyzer] пожалуйста, проверьте, установлены ли какие-либо необходимые плагины, или проверьте документацию по последним изменениям для удаленных настроек», «suppressed»:[{«type»:»illegal_argument_exception»,»причина»:»неизвестная настройка [index.softwarePublisher.fields.ngram.search_analyzer] пожалуйста, проверьте, установлены ли какие-либо необходимые плагины, или проверьте документацию по последним изменениям для удаленных настроек»},{«тип»:»illegal_argument_exception»,»причина»: «неизвестная настройка [index.softwarePublisher.fields.ngram.type] пожалуйста, проверьте, установлены ли какие-либо необходимые плагины, или проверьте документацию по последним изменениям для удаленных настроек»},{«type»:»illegal_argument_exception»,»reason»:»неизвестная настройка [index.softwarePublisher.fields.raw.type] пожалуйста, проверьте, установлены ли какие-либо необходимые плагины, или проверьте документацию по последним изменениям для удаленных настроек»},{«type»:»illegal_argument_exception»,»reason»:»неизвестная настройка [index.softwarePublisher.fields.rawl.normalizer] пожалуйста, проверьте, установлены ли какие-либо необходимые плагины, илипроверьте документацию по критическим изменениям для удаленных настроек «},{«type»:»illegal_argument_exception»,»reason»:»неизвестная настройка [index.softwarePublisher.fields.rawl.type] пожалуйста, убедитесь, что установлены все необходимые плагины, или проверьте документацию по критическим изменениям для удаленных настроек»},{«type»:»illegal_argument_exception»,»reason»: «неизвестная настройка [index.softwarePublisher.type] пожалуйста, проверьте, установлены ли все необходимые плагины, или проверьте документацию по последним изменениям для удаленных настроек»}]},»статус»: 400}

I tried to with putMappings but anyway I got an error.

EDIT

Elastic version

 curl -XGET 'http://localhost:9200'
{
  "name" : "bf9cd8c528fc",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "MzMfZzJaQwia1A5U5SFzNg",
  "version" : {
    "number" : "7.1.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "7a013de",
    "build_date" : "2019-05-23T14:04:00.380842Z",
    "build_snapshot" : false,
    "lucene_version" : "8.0.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
 

РЕДАКТИРОВАТЬ 2

Ошибка при использовании putMapping

{«ошибка»:{«root_cause»:[{«type»:»mapper_parsing_exception»,»причина»: «Определение корневого сопоставления имеет неподдерживаемые параметры: [publisher : {type=text, fields={rawl={normalizer=lowercase_normalizer, type=ключевое слово}, raw={type=ключевое слово}, ngram={search_analyzer=software_search_analyzer, анализатор=software_analyzer, тип=текст}}}]»}],»тип»:»mapper_parsing_exception»,»причина»: «Определение корневого сопоставления имеет неподдерживаемые параметры: [издатель: {тип=текст, поля ={rawl={нормализатор= нормализатор нижнего регистра, тип = ключевое слово}, raw={тип= ключевое слово}, ngram={search_analyzer=software_search_analyzer, анализатор =software_analyzer, тип =текст}}}]»},»статус»: 400}

Анализатор

 export const softwareNameAnalyzer = {
  filter: {
    ngram_custom: {
      type: "edge_ngram",
      min_gram: "1",
      max_gram: "15",
    },
  },
  tokenizer: {
    software_tokenizer,
  },
  normalizer: {
    lowercase_normalizer: {
      filter: ["lowercase"],
    },
  },
  analyzer: {
    software_search_analyzer: defaultAnalyzer,
    software_analyzer: softwareAnalyzer,
    default: defaultAnalyzer,
    default_search: defaultAnalyzer,
  },
};

export const softwareAnalyzer = {
  type: "custom",
  tokenizer: "software_tokenizer",
  char_filter: ["html_strip"],
  filter: ["lowercase", "ngram_custom"],
};
 

Есть идеи?

Спасибо?

Комментарии:

1. Какую версию ES вы используете?

2. только что обновлена информация о версии

3. Вы должны использовать putMappings() not putSettings() , поскольку вы определяете поля. С какой ошибкой вы putMappings() сталкиваетесь?

4. Также как вы определяете свои пользовательские анализаторы?

5. Просто обновите информацию thx

Ответ №1:

Во-первых, вы должны использовать putMappings() not putSettings() , поскольку вы определяете поля.

Затем вы должны вызвать putMappings() следующим образом (вы пропускаете properties раздел):

 await this.getClient().indices.putMappings({index: indexName, body:{ 
  properties: {                            <<----- add this
      softwarePublisher: {
         ...
      }
  }
}});
 

Примечание: вам нужно убедиться, что вы вызываете putSettings() before putMappings , чтобы сначала были установлены ваши пользовательские анализаторы, иначе putMappings() вызов будет жаловаться, что ваши пользовательские анализаторы не существуют.

Комментарии:

1. Как я вызывал putSettings раньше? с пустым значением, таким как putSettings(); putMappings({index: IndexName, body:{…?

2. Нет, вам нужно предоставить свои пользовательские анализаторы

3. хорошо, спасибо за ответ.

4. Круто, рад, что это помогло!