Существует несколько свойств, проиндексированных по одному и тому же имени поля …, но с разными настройками индексации. Поведение не определено

#java #hibernate #hibernate-search

#java #спящий режим #спящий режим-поиск

Вопрос:

При запуске приложения поиска в режиме гибернации в моем журнале появляется следующее:

WARN 23 Jun 2014 15:08:51,623 org.hibernate.search.engine.metadata.impl.TypeMetadata:339 - HSEARCH000120: There are multiple properties indexed against the same field name 'foo.bar', but with different indexing settings. The behaviour is undefined.

Я вижу, что предупреждение регистрируется из:

 private Map<String, DocumentFieldMetadata> keyFieldMetadata(Set<PropertyMetadata> propertyMetadataSet) {
    Map<String, DocumentFieldMetadata> tmpMap = new HashMap<String, DocumentFieldMetadata>();
    for ( PropertyMetadata propertyMetadata : propertyMetadataSet ) {
        for ( DocumentFieldMetadata documentFieldMetadata : propertyMetadata.getFieldMetadata() ) {
            DocumentFieldMetadata oldFieldMetadata = tmpMap.put(
                    documentFieldMetadata.getName(),
                    documentFieldMetadata
            );
            if ( oldFieldMetadata != null ) {
                if ( !documentFieldMetadata.getIndex().equals( oldFieldMetadata.getIndex() ) ) {
                    **log.inconsistentFieldConfiguration( documentFieldMetadata.getName()** );
                }
            }
        }
    }

    for ( DocumentFieldMetadata documentFieldMetadata : classBridgeFields ) {
        tmpMap.put( documentFieldMetadata.getName(), documentFieldMetadata );
    }

    if ( idPropertyMetadata != null ) {
        for ( DocumentFieldMetadata documentFieldMetadata : idPropertyMetadata.getFieldMetadata() ) {
            tmpMap.put( documentFieldMetadata.getName(), documentFieldMetadata );
        }
    }
    return Collections.unmodifiableMap( tmpMap );
}
  

но у меня возникли проблемы с пониманием цели этого кода или того, как мой код может привести к тому, что он будет соответствовать условию. Похоже, что это происходит только в полях, помеченных @IndexedEmbedded я Погуглил и ничего не нашел для ошибки.

Я предполагаю, что это всегда было проблемой в коде, но я только недавно обновился с Hibernate Search 4.2.0.Final до 4.5.1.Final, и именно тогда начало появляться предупреждение.

Обновить

 @Entity
@Table(name = "data_providers")
@Immutable
@Embeddable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class EDataProvider {

   private static final long serialVersionUID = -4207808146855081627L;

   public static final String FIELD_ASSOCIATIONS = "associations.";

   public static final String FIELD_ID = "id";

   private List<EDataProvider> associatedProviders;

   private Long id;

   private boolean isInternal;

   private String name;

   private Float priority;

   public EDataProvider() {

      this(null, null);
   }

   /**
    * @param name
    * @param id
    */
   public EDataProvider(final String name, final Long id) {

      super();
      this.name = name;
      this.id = id;
      associatedProviders = new Vector<EDataProvider>();
   }

   /**
    * @param newProvider
    */
   public void addAssociatedProvider(final EDataProvider newProvider) {

      associatedProviders.add(newProvider);
   }

   @Override
   public boolean equals(final Object obj) {

      if (this == obj) {
         return true;
      }
      if ((obj == null) || !(obj instanceof EDataProvider)) {
         return false;
      }
      final EDataProvider other = (EDataProvider) obj;
      if (!ObjectUtil.equals(getId(), other.getId())) {
         return false;
      }
      return true;
   }

   @ManyToMany(fetch = FetchType.LAZY,
               cascade = { CascadeType.PERSIST, CascadeType.MERGE })
   @JoinTable(name = "data_provider_associations",
              joinColumns = { @JoinColumn(name = "parent_id") },
              inverseJoinColumns = { @JoinColumn(name = "child_id") })
   @IndexedEmbedded(depth = 1,
                    prefix = FIELD_ASSOCIATIONS)
   @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
   public List<EDataProvider> getAssociatedProviders() {

      return associatedProviders;
   }

   @Id
   @Column(name = "id")
   @Field(name = FIELD_ID)
   public Long getId() {

      return id;
   }

   @Column(name = "name")
   public String getName() {

      return name;
   }

   @Column(name = "boost")
   public Float getPriority() {

      return priority;
   }

   @Override
   public int hashCode() {

      return EncodingUtil.makeHashCode(31, getId());
   }

   @Column(name = "internal")
   public boolean isInternal() {

      return isInternal;
   }

   public void removeAssociatedProvider(final EDataProvider newProvider) {

      associatedProviders.remove(newProvider);
   }

   /**
    * @param newAssociatedProviders
    *           the associatedProviders to set
    */
   public void setAssociatedProviders(
         final List<EDataProvider> newAssociatedProviders) {

      associatedProviders = newAssociatedProviders;
   }

   /**
    * @param dataProviderId
    *           the dataProviderId to set
    */
   public void setId(final Long dataProviderId) {

      id = dataProviderId;
   }

   public void setInternal(final boolean isInternal) {

      this.isInternal = isInternal;
   }

   /**
    * @param name
    *           the name to set
    */
   public void setName(final String name) {

      this.name = name;
   }

   /**
    * @param priority
    *           the priority to set
    */
   public void setPriority(final Float priority) {

      this.priority = priority;
   }

   @Override
   public String toString() {

      return String.format("provider:{id:%d, name:%s, priority:%f}", id, name,
            priority);
   }
}
  

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

1. Можете ли вы поделиться своей конфигурацией объекта? У вас есть несколько свойств, проиндексированных по одному и тому же полю документа Lucene?

2. @Hardy Я опубликовал объект выше; однако, я полагаю, что нашел подозреваемого. Поле ID было аннотировано в дочернем объекте с @Field помощью аннотации, а также включено в индекс родительского объекта. Родительский объект использует пользовательский анализатор, поэтому в настройках индексации произошел конфликт. Как только я удалил @Field аннотацию из дочернего объекта, ошибки исчезли. Звучит ли это как правильное предположение?

Ответ №1:

Поле ID было аннотировано в дочернем объекте с помощью аннотации @Field, а также включено в индекс родительского объекта. Родительский объект использует пользовательский анализатор, поэтому в настройках индексации произошел конфликт. Как только я удалил аннотацию @Field из дочернего объекта, ошибки исчезли.