From 6db999718bb80f194bb5b7d39e9663ba116cc07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Tue, 28 Apr 2020 16:22:07 +0200 Subject: [PATCH] HSEARCH-3273 Use an analyzer backed by LuceneIndexModel for indexing So that dynamic fields will be correctly handled. --- .../LuceneIndexSchemaFieldNodeBuilder.java | 1 - .../LuceneIndexSchemaRootNodeBuilder.java | 12 +----- .../document/model/impl/LuceneIndexModel.java | 41 +++++++++++++++---- .../impl/LuceneIndexSchemaNodeCollector.java | 5 --- .../impl/IndexManagerBackendContext.java | 2 +- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaFieldNodeBuilder.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaFieldNodeBuilder.java index 35de6e8a264..b6ab1f60189 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaFieldNodeBuilder.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaFieldNodeBuilder.java @@ -75,7 +75,6 @@ public void contribute(LuceneIndexSchemaNodeCollector collector, LuceneIndexSche ); collector.collectFieldNode( fieldNode.getAbsoluteFieldPath(), fieldNode ); - collector.collectAnalyzer( fieldNode.getAbsoluteFieldPath(), type.getAnalyzerOrNormalizer() ); reference.enable( fieldNode ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaRootNodeBuilder.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaRootNodeBuilder.java index f2f7692eb80..15342c34e4f 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaRootNodeBuilder.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/dsl/impl/LuceneIndexSchemaRootNodeBuilder.java @@ -9,14 +9,11 @@ import java.util.HashMap; import java.util.Map; -import org.apache.lucene.analysis.Analyzer; - import org.hibernate.search.backend.lucene.analysis.model.impl.LuceneAnalysisDefinitionRegistry; import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexModel; import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaFieldNode; import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaNodeCollector; import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaObjectNode; -import org.hibernate.search.backend.lucene.analysis.impl.ScopedAnalyzer; import org.hibernate.search.backend.lucene.types.dsl.LuceneIndexFieldTypeFactory; import org.hibernate.search.backend.lucene.types.dsl.impl.LuceneIndexFieldTypeFactoryImpl; import org.hibernate.search.engine.backend.document.model.dsl.spi.IndexSchemaBuildContext; @@ -71,14 +68,8 @@ public LuceneIndexSchemaRootNodeBuilder getRootNodeBuilder() { public LuceneIndexModel build(String indexName) { Map objectNodesBuilder = new HashMap<>(); Map> fieldNodesBuilder = new HashMap<>(); - ScopedAnalyzer.Builder scopedAnalyzerBuilder = new ScopedAnalyzer.Builder(); LuceneIndexSchemaNodeCollector collector = new LuceneIndexSchemaNodeCollector() { - @Override - public void collectAnalyzer(String absoluteFieldPath, Analyzer analyzer) { - scopedAnalyzerBuilder.setAnalyzer( absoluteFieldPath, analyzer ); - } - @Override public void collectFieldNode(String absoluteFieldPath, LuceneIndexSchemaFieldNode node) { fieldNodesBuilder.put( absoluteFieldPath, node ); @@ -98,8 +89,7 @@ public void collectObjectNode(String absolutePath, LuceneIndexSchemaObjectNode n mappedTypeName, idDslConverter == null ? new StringToDocumentIdentifierValueConverter() : idDslConverter, objectNodesBuilder, - fieldNodesBuilder, - scopedAnalyzerBuilder.build() + fieldNodesBuilder ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexModel.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexModel.java index 2b3de5847d0..2371c559c20 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexModel.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexModel.java @@ -8,12 +8,15 @@ import java.util.Map; -import org.hibernate.search.backend.lucene.analysis.impl.ScopedAnalyzer; +import org.hibernate.search.backend.lucene.lowlevel.common.impl.AnalyzerConstants; import org.hibernate.search.engine.backend.types.converter.spi.ToDocumentIdentifierValueConverter; import org.hibernate.search.util.common.reporting.EventContext; import org.hibernate.search.engine.reporting.spi.EventContexts; import org.hibernate.search.util.common.impl.CollectionHelper; +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.DelegatingAnalyzerWrapper; + public class LuceneIndexModel implements AutoCloseable { @@ -27,25 +30,24 @@ public class LuceneIndexModel implements AutoCloseable { private final Map> fieldNodes; - private final ScopedAnalyzer scopedAnalyzer; + private final ModelBasedScopedAnalyzer indexingAnalyzer; public LuceneIndexModel(String indexName, String mappedTypeName, ToDocumentIdentifierValueConverter idDslConverter, Map objectNodesBuilder, - Map> fieldNodesBuilder, - ScopedAnalyzer scopedAnalyzer) { + Map> fieldNodesBuilder) { this.indexName = indexName; this.mappedTypeName = mappedTypeName; this.idDslConverter = idDslConverter; this.fieldNodes = CollectionHelper.toImmutableMap( fieldNodesBuilder ); this.objectNodes = CollectionHelper.toImmutableMap( objectNodesBuilder ); - this.scopedAnalyzer = scopedAnalyzer; + this.indexingAnalyzer = new ModelBasedScopedAnalyzer(); } @Override public void close() { - scopedAnalyzer.close(); + indexingAnalyzer.close(); } public String getIndexName() { @@ -72,8 +74,8 @@ public LuceneIndexSchemaObjectNode getObjectNode(String absolutePath) { return objectNodes.get( absolutePath ); } - public ScopedAnalyzer getScopedAnalyzer() { - return scopedAnalyzer; + public Analyzer getIndexingAnalyzer() { + return indexingAnalyzer; } @Override @@ -84,4 +86,27 @@ public String toString() { .append( "]" ) .toString(); } + + /** + * An analyzer similar to {@link org.hibernate.search.backend.lucene.analysis.impl.ScopedAnalyzer}, + * except the field → analyzer map is implemented by querying the model. + * This allows taking into account dynamic fields created through templates. + */ + private class ModelBasedScopedAnalyzer extends DelegatingAnalyzerWrapper { + protected ModelBasedScopedAnalyzer() { + super( PER_FIELD_REUSE_STRATEGY ); + } + + @Override + protected Analyzer getWrappedAnalyzer(String fieldName) { + LuceneIndexSchemaFieldNode field = getFieldNode( fieldName ); + Analyzer analyzer = field.getType().getAnalyzerOrNormalizer(); + + if ( analyzer == null ) { + return AnalyzerConstants.KEYWORD_ANALYZER; + } + + return analyzer; + } + } } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexSchemaNodeCollector.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexSchemaNodeCollector.java index d8f0e6e0013..eea5373e0db 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexSchemaNodeCollector.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/document/model/impl/LuceneIndexSchemaNodeCollector.java @@ -6,14 +6,9 @@ */ package org.hibernate.search.backend.lucene.document.model.impl; -import org.apache.lucene.analysis.Analyzer; - public interface LuceneIndexSchemaNodeCollector { - void collectObjectNode(String absolutePath, LuceneIndexSchemaObjectNode schemaObjectNode); void collectFieldNode(String absoluteFieldPath, LuceneIndexSchemaFieldNode schemaFieldNode); - - void collectAnalyzer(String absoluteFieldPath, Analyzer analyzer); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/index/impl/IndexManagerBackendContext.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/index/impl/IndexManagerBackendContext.java index 5cc61af18de..6398450d1e5 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/index/impl/IndexManagerBackendContext.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/index/impl/IndexManagerBackendContext.java @@ -208,7 +208,7 @@ Shard createShard(IOStrategy ioStrategy, LuceneIndexModel model, Optional