Skip to content

Commit

Permalink
HSEARCH-4018 Avoid filtering out nested documents in Lucene queries w…
Browse files Browse the repository at this point in the history
…hen we know there are none
  • Loading branch information
yrodiere committed Sep 23, 2020
1 parent b8bd293 commit a9a8d4e
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 7 deletions.
Expand Up @@ -19,6 +19,7 @@
import org.hibernate.search.engine.backend.document.model.spi.IndexFieldInclusion;
import org.hibernate.search.engine.backend.metamodel.IndexDescriptor;
import org.hibernate.search.engine.backend.metamodel.IndexFieldDescriptor;
import org.hibernate.search.engine.backend.types.ObjectStructure;
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;
Expand All @@ -42,6 +43,7 @@ public class LuceneIndexModel implements AutoCloseable, IndexDescriptor {
private final List<IndexFieldDescriptor> staticFields;
private final List<LuceneIndexSchemaObjectFieldTemplate> objectFieldTemplates;
private final List<LuceneIndexSchemaValueFieldTemplate> valueFieldTemplates;
private final boolean hasNestedDocuments;
private final ConcurrentMap<String, LuceneIndexSchemaObjectFieldNode> dynamicObjectFieldNodesCache = new ConcurrentHashMap<>();
private final ConcurrentMap<String, LuceneIndexSchemaValueFieldNode<?>> dynamicValueFieldNodesCache = new ConcurrentHashMap<>();

Expand Down Expand Up @@ -74,6 +76,7 @@ public LuceneIndexModel(String indexName,
this.searchAnalyzer = new SearchScopedAnalyzer();
this.objectFieldTemplates = objectFieldTemplates;
this.valueFieldTemplates = valueFieldTemplates;
this.hasNestedDocuments = initHasNestedDocuments();
}

@Override
Expand Down Expand Up @@ -129,6 +132,10 @@ public LuceneIndexSchemaValueFieldNode<?> getFieldNode(String absolutePath, Inde
return node == null ? null : filter.filter( node, node.inclusion() );
}

public boolean hasNestedDocuments() {
return hasNestedDocuments;
}

public Analyzer getIndexingAnalyzer() {
return indexingAnalyzer;
}
Expand Down Expand Up @@ -225,4 +232,29 @@ protected Analyzer getWrappedAnalyzer(String fieldName) {
return analyzer;
}
}

private boolean initHasNestedDocuments() {
for ( LuceneIndexSchemaObjectFieldNode node : objectFieldNodes.values() ) {
if ( isNested( node.structure() ) ) {
return true;
}
}
for ( LuceneIndexSchemaObjectFieldTemplate template : objectFieldTemplates ) {
if ( isNested( template.structure() ) ) {
return true;
}
}
return false;
}

private boolean isNested(ObjectStructure structure) {
switch ( structure ) {
case NESTED:
return true;
case FLATTENED:
case DEFAULT:
default:
return false;
}
}
}
Expand Up @@ -6,12 +6,12 @@
*/
package org.hibernate.search.backend.lucene.document.model.impl;

import java.util.Collections;

import org.hibernate.search.engine.backend.types.ObjectStructure;
import org.hibernate.search.engine.backend.document.model.spi.IndexFieldInclusion;
import org.hibernate.search.engine.backend.types.ObjectStructure;
import org.hibernate.search.util.common.pattern.spi.SimpleGlobPattern;

import java.util.Collections;


public class LuceneIndexSchemaObjectFieldTemplate
extends AbstractLuceneIndexSchemaFieldTemplate<LuceneIndexSchemaObjectFieldNode> {
Expand All @@ -34,4 +34,8 @@ protected LuceneIndexSchemaObjectFieldNode createNode(LuceneIndexSchemaObjectNod
Collections.emptyList()
);
}

public ObjectStructure structure() {
return structure;
}
}
Expand Up @@ -19,17 +19,17 @@
import java.util.Set;

import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexModel;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaValueFieldNode;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaObjectFieldNode;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaValueFieldNode;
import org.hibernate.search.backend.lucene.logging.impl.Log;
import org.hibernate.search.backend.lucene.search.impl.LuceneMultiIndexSearchValueFieldContext;
import org.hibernate.search.backend.lucene.search.impl.LuceneSearchIndexContext;
import org.hibernate.search.backend.lucene.search.impl.LuceneSearchValueFieldContext;
import org.hibernate.search.backend.lucene.search.impl.LuceneSearchIndexesContext;
import org.hibernate.search.backend.lucene.search.impl.LuceneSearchValueFieldContext;
import org.hibernate.search.backend.lucene.types.predicate.impl.LuceneObjectPredicateBuilderFactory;
import org.hibernate.search.backend.lucene.types.predicate.impl.LuceneObjectPredicateBuilderFactoryImpl;
import org.hibernate.search.engine.backend.types.ObjectStructure;
import org.hibernate.search.engine.backend.document.model.spi.IndexFieldFilter;
import org.hibernate.search.engine.backend.types.ObjectStructure;
import org.hibernate.search.engine.backend.types.converter.spi.StringToDocumentIdentifierValueConverter;
import org.hibernate.search.engine.backend.types.converter.spi.ToDocumentIdentifierValueConverter;
import org.hibernate.search.engine.reporting.spi.EventContexts;
Expand Down Expand Up @@ -181,6 +181,16 @@ public LuceneSearchValueFieldContext<?> field(String absoluteFieldPath) {
return resultOrNull;
}

@Override
public boolean hasNestedDocuments() {
for ( LuceneScopeIndexManagerContext element : elements() ) {
if ( element.model().hasNestedDocuments() ) {
return true;
}
}
return false;
}

@Override
public void checkNestedField(String absoluteFieldPath) {
boolean found = false;
Expand Down
Expand Up @@ -29,6 +29,8 @@ public interface LuceneSearchIndexesContext {

LuceneSearchValueFieldContext<?> field(String absoluteFieldPath);

boolean hasNestedDocuments();

void checkNestedField(String absoluteFieldPath);

List<String> nestedPathHierarchyForObject(String absoluteFieldPath);
Expand Down
Expand Up @@ -174,7 +174,10 @@ public LuceneSearchQuery<H> build() {

BooleanQuery.Builder luceneQueryBuilder = new BooleanQuery.Builder();
luceneQueryBuilder.add( luceneQuery, Occur.MUST );
luceneQueryBuilder.add( Queries.mainDocumentQuery(), Occur.FILTER );
if ( searchContext.indexes().hasNestedDocuments() ) {
// HSEARCH-4018: this filter has a (small) cost, so we only add it if necessary.
luceneQueryBuilder.add( Queries.mainDocumentQuery(), Occur.FILTER );
}
if ( !routingKeys.isEmpty() ) {
Query routingKeysQuery = Queries.anyTerm( MetadataFields.routingKeyFieldName(), routingKeys );
luceneQueryBuilder.add( routingKeysQuery, Occur.FILTER );
Expand Down

0 comments on commit a9a8d4e

Please sign in to comment.