Skip to content

Commit

Permalink
HSEARCH-3273 Use an analyzer backed by LuceneIndexModel for indexing
Browse files Browse the repository at this point in the history
So that dynamic fields will be correctly handled.
  • Loading branch information
yrodiere committed May 5, 2020
1 parent 095953a commit 6db9997
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 26 deletions.
Expand Up @@ -75,7 +75,6 @@ public void contribute(LuceneIndexSchemaNodeCollector collector, LuceneIndexSche
);

collector.collectFieldNode( fieldNode.getAbsoluteFieldPath(), fieldNode );
collector.collectAnalyzer( fieldNode.getAbsoluteFieldPath(), type.getAnalyzerOrNormalizer() );

reference.enable( fieldNode );
}
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -71,14 +68,8 @@ public LuceneIndexSchemaRootNodeBuilder getRootNodeBuilder() {
public LuceneIndexModel build(String indexName) {
Map<String, LuceneIndexSchemaObjectNode> objectNodesBuilder = new HashMap<>();
Map<String, LuceneIndexSchemaFieldNode<?>> 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 );
Expand All @@ -98,8 +89,7 @@ public void collectObjectNode(String absolutePath, LuceneIndexSchemaObjectNode n
mappedTypeName,
idDslConverter == null ? new StringToDocumentIdentifierValueConverter() : idDslConverter,
objectNodesBuilder,
fieldNodesBuilder,
scopedAnalyzerBuilder.build()
fieldNodesBuilder
);
}

Expand Down
Expand Up @@ -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 {

Expand All @@ -27,25 +30,24 @@ public class LuceneIndexModel implements AutoCloseable {

private final Map<String, LuceneIndexSchemaFieldNode<?>> fieldNodes;

private final ScopedAnalyzer scopedAnalyzer;
private final ModelBasedScopedAnalyzer indexingAnalyzer;

public LuceneIndexModel(String indexName,
String mappedTypeName,
ToDocumentIdentifierValueConverter<?> idDslConverter,
Map<String, LuceneIndexSchemaObjectNode> objectNodesBuilder,
Map<String, LuceneIndexSchemaFieldNode<?>> fieldNodesBuilder,
ScopedAnalyzer scopedAnalyzer) {
Map<String, LuceneIndexSchemaFieldNode<?>> 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() {
Expand All @@ -72,8 +74,8 @@ public LuceneIndexSchemaObjectNode getObjectNode(String absolutePath) {
return objectNodes.get( absolutePath );
}

public ScopedAnalyzer getScopedAnalyzer() {
return scopedAnalyzer;
public Analyzer getIndexingAnalyzer() {
return indexingAnalyzer;
}

@Override
Expand All @@ -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 &rarr; 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;
}
}
}
Expand Up @@ -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);
}
Expand Up @@ -208,7 +208,7 @@ Shard createShard(IOStrategy ioStrategy, LuceneIndexModel model, Optional<String
String indexName = model.getIndexName();
EventContext shardEventContext = EventContexts.fromIndexNameAndShardId( model.getIndexName(), shardId );
IndexWriterConfigSource writerConfigSource = IndexWriterConfigSource.create(
similarity, model.getScopedAnalyzer(), propertySource, shardEventContext
similarity, model.getIndexingAnalyzer(), propertySource, shardEventContext
);

try {
Expand Down

0 comments on commit 6db9997

Please sign in to comment.