You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2015/03/20 15:52:19 UTC
svn commit: r1668034 - in /jackrabbit/oak/trunk/oak-lucene: ./
src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/
src/main/java/org/apache/jackrabbit/oak/plugins/index/lucen...
Author: thomasm
Date: Fri Mar 20 14:52:19 2015
New Revision: 1668034
URL: http://svn.apache.org/r1668034
Log:
OAK-2399 Custom scorer for modifying score per documents
Added:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java
Modified:
jackrabbit/oak/trunk/oak-lucene/pom.xml
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
Modified: jackrabbit/oak/trunk/oak-lucene/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/pom.xml?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-lucene/pom.xml Fri Mar 20 14:52:19 2015
@@ -106,9 +106,13 @@
org.apache.lucene.*;version=${lucene.version}
</_exportcontents>
<Export-Package>
- org.apache.jackrabbit.oak.plugins.index.lucene,
- org.apache.jackrabbit.oak.plugins.index.lucene.util
+ org.apache.jackrabbit.oak.plugins.index.lucene,
+ org.apache.jackrabbit.oak.plugins.index.lucene.util,
+ org.apache.jackrabbit.oak.plugins.index.lucene.score,
</Export-Package>
+ <_exportcontents>
+ org.apache.lucene.*;version=${lucene.version}
+ </_exportcontents>
<Import-Package>
org.apache.lucene.sandbox.*;resolution:=optional,
!org.apache.lucene.*,
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java Fri Mar 20 14:52:19 2015
@@ -185,6 +185,8 @@ class IndexDefinition implements Aggrega
private final Analyzer analyzer;
+ private final String scorerProviderName;
+
private final Map<String, Analyzer> analyzers;
private final boolean hasCustomTikaConfig;
@@ -254,6 +256,7 @@ class IndexDefinition implements Aggrega
this.hasCustomTikaConfig = getTikaConfigNode().exists();
this.maxExtractLength = determineMaxExtractLength();
this.suggesterUpdateFrequencyMinutes = getOptionalValue(defn, LuceneIndexConstants.SUGGEST_UPDATE_FREQUENCY_MINUTES, 60);
+ this.scorerProviderName = getOptionalValue(defn, LuceneIndexConstants.PROP_SCORER_PROVIDER, null);
}
public boolean isFullTextEnabled() {
@@ -354,6 +357,10 @@ class IndexDefinition implements Aggrega
return maxExtractLength;
}
+ public String getScorerProviderName() {
+ return scorerProviderName;
+ }
+
@Override
public String toString() {
return "Lucene Index : " + indexName;
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java Fri Mar 20 14:52:19 2015
@@ -130,6 +130,8 @@ public interface LuceneIndexConstants {
String PROP_ORDERED = "ordered";
+ String PROP_SCORER_PROVIDER = "scorerProviderName";
+
/**
* Integer property indicating that LuceneIndex should be
* used in compat mode to specific version
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java Fri Mar 20 14:52:19 2015
@@ -23,6 +23,7 @@ import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.plugins.index.aggregate.AggregateIndex;
import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.Observer;
import org.apache.jackrabbit.oak.spi.query.QueryIndex;
@@ -42,12 +43,19 @@ public class LuceneIndexProvider impleme
protected volatile NodeAggregator aggregator = null;
+ ScorerProviderFactory scorerFactory;
+
public LuceneIndexProvider() {
this(new IndexTracker());
}
public LuceneIndexProvider(IndexTracker tracker) {
+ this(tracker, ScorerProviderFactory.DEFAULT);
+ }
+
+ public LuceneIndexProvider(IndexTracker tracker, ScorerProviderFactory scorerFactory) {
this.tracker = tracker;
+ this.scorerFactory = scorerFactory;
}
public void close() {
@@ -73,7 +81,7 @@ public class LuceneIndexProvider impleme
}
protected LucenePropertyIndex newLucenePropertyIndex() {
- return new LucenePropertyIndex(tracker);
+ return new LucenePropertyIndex(tracker, scorerFactory);
}
/**
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java Fri Mar 20 14:52:19 2015
@@ -40,6 +40,7 @@ import org.apache.jackrabbit.oak.commons
import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
import org.apache.jackrabbit.oak.spi.commit.Observer;
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
@@ -109,6 +110,9 @@ public class LuceneIndexProviderService
private BackgroundObserver backgroundObserver;
+ @Reference
+ ScorerProviderFactory scorerFactory;
+
@Activate
private void activate(BundleContext bundleContext, Map<String, ?> config)
throws NotCompliantMBeanException {
@@ -117,7 +121,7 @@ public class LuceneIndexProviderService
executor = new WhiteboardExecutor();
executor.start(whiteboard);
- indexProvider = new LuceneIndexProvider(createTracker(bundleContext, config));
+ indexProvider = new LuceneIndexProvider(createTracker(bundleContext, config), scorerFactory);
initializeLogging(config);
initialize();
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java Fri Mar 20 14:52:19 2015
@@ -43,6 +43,7 @@ import org.apache.jackrabbit.oak.commons
import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
import org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.IndexingRule;
import org.apache.jackrabbit.oak.plugins.index.lucene.IndexPlanner.PlanResult;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
import org.apache.jackrabbit.oak.plugins.index.lucene.util.MoreLikeThisHelper;
import org.apache.jackrabbit.oak.plugins.index.lucene.util.SpellcheckHelper;
import org.apache.jackrabbit.oak.plugins.index.lucene.util.SuggestHelper;
@@ -70,6 +71,7 @@ import org.apache.lucene.index.IndexRead
import org.apache.lucene.index.MultiFields;
import org.apache.lucene.index.StoredFieldVisitor;
import org.apache.lucene.index.Term;
+import org.apache.lucene.queries.CustomScoreQuery;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
@@ -169,8 +171,16 @@ public class LucenePropertyIndex impleme
protected final IndexTracker tracker;
+ private final ScorerProviderFactory scorerProviderFactory;
+
public LucenePropertyIndex(IndexTracker tracker) {
this.tracker = tracker;
+ this.scorerProviderFactory = ScorerProviderFactory.DEFAULT;
+ }
+
+ public LucenePropertyIndex(IndexTracker tracker, ScorerProviderFactory factory) {
+ this.tracker = tracker;
+ this.scorerProviderFactory = factory;
}
@Override
@@ -308,6 +318,13 @@ public class LucenePropertyIndex impleme
LuceneRequestFacade luceneRequestFacade = getLuceneRequest(plan, searcher.getIndexReader());
if (luceneRequestFacade.getLuceneRequest() instanceof Query) {
Query query = (Query) luceneRequestFacade.getLuceneRequest();
+
+ CustomScoreQuery customScoreQuery = getCustomScoreQuery(plan, query);
+
+ if (customScoreQuery != null) {
+ query = customScoreQuery;
+ }
+
TopDocs docs;
long time = System.currentTimeMillis();
if (lastDoc != null) {
@@ -584,6 +601,17 @@ public class LucenePropertyIndex impleme
return new LuceneRequestFacade<Query>(bq);
}
+ private CustomScoreQuery getCustomScoreQuery(IndexPlan plan, Query subQuery) {
+ PlanResult planResult = getPlanResult(plan);
+ IndexDefinition idxDef = planResult.indexDefinition;
+ String providerName = idxDef.getScorerProviderName();
+ if (scorerProviderFactory != null && providerName != null) {
+ return scorerProviderFactory.getScorerProvider(providerName)
+ .createCustomScoreQuery(subQuery);
+ }
+ return null;
+ }
+
private static void addNonFullTextConstraints(List<Query> qs,
IndexPlan plan, IndexReader reader) {
Filter filter = plan.getFilter();
Added: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java?rev=1668034&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java (added)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java Fri Mar 20 14:52:19 2015
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.lucene.score;
+
+import org.apache.lucene.queries.CustomScoreQuery;
+import org.apache.lucene.search.Query;
+
+public interface ScorerProvider {
+ String getName();
+ CustomScoreQuery createCustomScoreQuery(Query subQuery);
+}
Added: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java?rev=1668034&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java (added)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java Fri Mar 20 14:52:19 2015
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.lucene.score;
+
+public interface ScorerProviderFactory {
+ ScorerProviderFactory DEFAULT = new ScorerProviderFactory() {
+ @Override
+ public ScorerProvider getScorerProvider(String name) {
+ return null;
+ }
+ };
+
+ ScorerProvider getScorerProvider(String name);
+}
Added: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java?rev=1668034&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java (added)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java Fri Mar 20 14:52:19 2015
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.lucene.score.impl;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component(metatype = false, immediate = true)
+@Service(value = ScorerProviderFactory.class)
+@Reference(name = "ScorerProvider",
+ policy = ReferencePolicy.DYNAMIC,
+ cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+ referenceInterface = ScorerProvider.class,
+ bind = "bindScorerProvider",
+ unbind = "unbindScorerProvider"
+)
+public class ScorerProviderFactoryImpl implements ScorerProviderFactory {
+
+ private Map<String, ScorerProvider> scorerProviderMap =
+ new ConcurrentHashMap<String, ScorerProvider>();
+
+ @Activate
+ private void activate() {
+ scorerProviderMap.clear();
+ }
+
+ @Deactivate
+ private void deactivate() {
+ scorerProviderMap.clear();
+ }
+
+ @Override
+ public ScorerProvider getScorerProvider(String scorerName) {
+ return scorerProviderMap.get(scorerName);
+ }
+
+ private void bindScorerProvider(ScorerProvider provider) {
+ scorerProviderMap.put(provider.getName(), provider);
+ }
+
+ private void unbindScorerProvider(ScorerProvider provider) {
+ scorerProviderMap.remove(provider.getName());
+ }
+}
Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java Fri Mar 20 14:52:19 2015
@@ -17,8 +17,10 @@
package org.apache.jackrabbit.oak.plugins.index.lucene;
import java.io.File;
+import java.io.IOException;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import javax.annotation.Nonnull;
@@ -31,6 +33,7 @@ import static com.google.common.collect.
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor;
+import static java.util.Arrays.asList;
import static javax.jcr.PropertyType.TYPENAME_STRING;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
@@ -50,6 +53,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_PATH;
import static org.apache.jackrabbit.oak.plugins.index.lucene.TestUtil.NT_TEST;
import static org.apache.jackrabbit.oak.plugins.index.lucene.TestUtil.createNodeWithType;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.TestUtil.useV2;
import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.newLuceneIndexDefinition;
import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.newLucenePropertyIndexDefinition;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
@@ -58,10 +62,13 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.spi.query.QueryIndex.IndexPlan;
import com.google.common.base.Function;
+import com.google.common.collect.Maps;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
import org.apache.jackrabbit.oak.query.QueryEngineSettings;
import org.apache.jackrabbit.oak.query.ast.Operator;
@@ -81,6 +88,12 @@ import org.apache.jackrabbit.oak.spi.sta
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.AtomicReader;
+import org.apache.lucene.index.AtomicReaderContext;
+import org.apache.lucene.queries.CustomScoreProvider;
+import org.apache.lucene.queries.CustomScoreQuery;
+import org.apache.lucene.search.Query;
import org.junit.After;
import org.junit.Test;
@@ -426,6 +439,71 @@ public class LuceneIndexTest {
}
@Test
+ public void customScoreQuery() throws Exception{
+ NodeBuilder nb = newLuceneIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "lucene",
+ of(TYPENAME_STRING));
+ TestUtil.useV2(nb);
+ nb.setProperty(LuceneIndexConstants.PROP_SCORER_PROVIDER, "testScorer");
+
+ NodeState before = builder.getNodeState();
+ builder.child("a").setProperty("jcr:createdBy", "bar bar");
+ builder.child("b").setProperty("jcr:createdBy", "foo bar");
+ NodeState after = builder.getNodeState();
+ NodeState indexed = HOOK.processCommit(before, after,CommitInfo.EMPTY);
+ IndexTracker tracker = new IndexTracker();
+ tracker.update(indexed);
+
+ SimpleScorerFactory factory = new SimpleScorerFactory();
+ ScorerProvider provider = new ScorerProvider() {
+
+ String scorerName = "testScorer";
+ @Override
+ public String getName() {
+ return scorerName;
+ }
+ @Override
+ public CustomScoreQuery createCustomScoreQuery(Query query) {
+ return new ModifiedCustomScoreQuery(query);
+ }
+
+ class ModifiedCustomScoreQuery extends CustomScoreQuery {
+ private Query query;
+ public ModifiedCustomScoreQuery(Query query) {
+ super(query);
+ this.query = query;
+ }
+
+ @Override
+ public CustomScoreProvider getCustomScoreProvider(AtomicReaderContext context) {
+ return new CustomScoreProvider(context) {
+ public float customScore(int doc, float subQueryScore, float valSrcScore) {
+ AtomicReader atomicReader = context.reader();
+ try {
+ Document document = atomicReader.document(doc);
+ // boosting docs created by foo
+ String fieldValue = document.get("full:jcr:createdBy");
+ if (fieldValue != null && fieldValue.contains("foo")) {
+ valSrcScore *= 2.0;
+ }
+ } catch (IOException e) {
+ return subQueryScore * valSrcScore;
+ }
+ return subQueryScore * valSrcScore;
+ }
+ };
+ }
+ }
+ };
+
+ factory.providers.put(provider.getName(), provider);
+ AdvancedQueryIndex queryIndex = new LucenePropertyIndex(tracker, factory);
+
+ FilterImpl filter = createFilter(NT_BASE);
+ filter.setFullTextConstraint(new FullTextTerm(null, "bar", false, false, null));
+ assertFilter(filter, queryIndex, indexed, asList("/b", "/a"), true);
+ }
+
+ @Test
public void testTokens() {
Analyzer analyzer = LuceneIndexConstants.ANALYZER;
assertEquals(ImmutableList.of("parent", "child"),
@@ -608,9 +686,37 @@ public class LuceneIndexTest {
return paths;
}
+ private static List<String> assertFilter(Filter filter, AdvancedQueryIndex queryIndex,
+ NodeState indexed, List<String> expected, boolean ordered) {
+ if (!ordered) {
+ return assertFilter(filter, queryIndex, indexed, expected);
+ }
+
+ List<IndexPlan> plans = queryIndex.getPlans(filter, null, indexed);
+ Cursor cursor = queryIndex.query(plans.get(0), indexed);
+
+ List<String> paths = newArrayList();
+ while (cursor.hasNext()) {
+ paths.add(cursor.next().getPath());
+ }
+ for (String p : expected) {
+ assertTrue("Expected path " + p + " not found", paths.contains(p));
+ }
+ assertEquals("Result set size is different", expected.size(), paths.size());
+ return paths;
+ }
+
private String getIndexDir(){
File dir = new File("target", "indexdir"+System.nanoTime());
dirs.add(dir);
return dir.getAbsolutePath();
}
+
+ private static class SimpleScorerFactory implements ScorerProviderFactory {
+ final Map<String,ScorerProvider> providers = Maps.newHashMap();
+ @Override
+ public ScorerProvider getScorerProvider(String name) {
+ return providers.get(name);
+ }
+ }
}
Re: svn commit: r1668034 - in /jackrabbit/oak/trunk/oak-lucene: ./
src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucen...
Posted by Chetan Mehrotra <ch...@gmail.com>.
On Fri, Mar 20, 2015 at 8:22 PM, <th...@apache.org> wrote:
> + @Activate
> + private void activate() {
> + scorerProviderMap.clear();
> + }
>
Probably this should only be done in deactivate
Chetan Mehrotra