Поиск в спящем режиме и поиск по запросу: mapper_parsing_exception + analyzer [...] не найден для поля [...] - PullRequest
0 голосов
/ 30 марта 2020

Я использую поиск в спящем режиме, чтобы автоматически создавать индексы для указанной c сущности

@Entity
@Indexed
public class Entity extends BaseEntity {

    private static final long serialVersionUID = -6465422564073923433L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @Field(bridge = @FieldBridge(impl = PropertyFieldBridge.class))
    private List<PropertyValue> properties = new ArrayList<>(); // PropertyValue is an abstract

}

Полевой мост создает строковые поля в формате: pt_ [a-zA-Z0-9 ] + _ i18n.

И после этого я создаю шаблон динамического c для работы с переведенными полями:

PUT {{elasticsearch}}/com.orm.entity.entity.entity/com.orm.entity.entity.Entity/_mapping
{
  "com.gamila.api.orm.entity.entity.Entity": {
    "dynamic_templates": [
      {
        "my_analyzer": {
          "match_mapping_type": "string",
          "match_pattern": "regex",
          "match": "^pt_[a-zA-Z0-9]+_i18n",
          "mapping": {
            "type": "text",
            "analyzer": "portugueseAnalyzer"
          }
        }
      }
    ]
  }
}

Но когда я создаю объект, он всегда возвращает ошибку:

Response: 400 'Bad Request' with body 
{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "analyzer [portugueseAnalyzer] not found for field [pt_name_i18n]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "analyzer [portugueseAnalyzer] not found for field [pt_name_i18n]"
  },
  "status": 400
}

PortugueseAnalyser определяется через:

public class Analyzer implements ElasticsearchAnalysisDefinitionProvider {

    @Override
    public void register(ElasticsearchAnalysisDefinitionRegistryBuilder builder) {
        builder.analyzer("portugueseAnalyzer")
                .withTokenizer("standard")
                .withTokenFilters("lowercase", "portugueseStemmer", "portugueseStop", "edge_ngram_3");

        builder.tokenFilter("portugueseStemmer")
                .type("stemmer").param("language", "portuguese");
        builder.tokenFilter("portugueseStop")
                .type("stop").param("stopwords", "_portuguese_");
    }

}

Может кто-нибудь сказать мне, что я делаю неправильно? Я уже пролистал некоторые вопросы здесь в stackoverflow без успеха.

PS: я используюasticsearch (5.6) из AWS

Заранее спасибо

1 Ответ

1 голос
/ 30 марта 2020

Когда Hibernate Search 5 отправляет отображение в Elasticsearch, оно будет включать только определения анализатора для анализаторов, которые фактически используются где-то в отображении. В вашем случае анализатор не используется в отношении Hibernate Search, поэтому он игнорируется.

В качестве обходного пути в Hibernate Search 5 вы можете объявить фиктивное поле, которое использует ваш анализатор, но никогда не будет быть заселённым Вы можете найти пример того, как это сделать здесь .

...