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 ch...@apache.org on 2015/05/12 16:17:51 UTC
svn commit: r1678954 - in /jackrabbit/oak/trunk/oak-lucene/src:
main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
test/java/org/apache/jackrabbit/oak/plugins/index/lucene/
Author: chetanm
Date: Tue May 12 14:17:51 2015
New Revision: 1678954
URL: http://svn.apache.org/r1678954
Log:
OAK-2863 - No matching result found with use of relative property names in fulltext search in some cases
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.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/LucenePropertyIndexTest.java
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java?rev=1678954&r1=1678953&r2=1678954&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java Tue May 12 14:17:51 2015
@@ -349,23 +349,31 @@ public class LuceneIndex implements Adva
TopDocs docs;
long time = System.currentTimeMillis();
checkForIndexVersionChange(searcher);
- if (lastDoc != null) {
- LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
- docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
- } else {
- LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
- docs = searcher.search(query, nextBatchSize);
- }
- time = System.currentTimeMillis() - time;
- LOG.debug("... took {} ms", time);
- nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
+ while (true) {
+ if (lastDoc != null) {
+ LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
+ docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
+ } else {
+ LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
+ docs = searcher.search(query, nextBatchSize);
+ }
+ time = System.currentTimeMillis() - time;
+ LOG.debug("... took {} ms", time);
+ nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
+
+ for (ScoreDoc doc : docs.scoreDocs) {
+ LuceneResultRow row = convertToRow(doc, searcher);
+ if (row != null) {
+ queue.add(row);
+ }
+ lastDocToRecord = doc;
+ }
- for (ScoreDoc doc : docs.scoreDocs) {
- LuceneResultRow row = convertToRow(doc, searcher);
- if (row != null) {
- queue.add(row);
+ if (queue.isEmpty() && docs.scoreDocs.length > 0) {
+ lastDoc = lastDocToRecord;
+ } else {
+ break;
}
- lastDocToRecord = doc;
}
} else if (luceneRequestFacade.getLuceneRequest() instanceof SpellcheckHelper.SpellcheckQuery) {
SpellcheckHelper.SpellcheckQuery spellcheckQuery = (SpellcheckHelper.SpellcheckQuery) luceneRequestFacade.getLuceneRequest();
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=1678954&r1=1678953&r2=1678954&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 Tue May 12 14:17:51 2015
@@ -291,14 +291,23 @@ public class LucenePropertyIndex impleme
path = "/";
}
if (pr.isPathTransformed()) {
+ String originalPath = path;
path = pr.transformPath(path);
+
+ if (path == null){
+ LOG.trace("Ignoring path {} : Transformation returned null", originalPath);
+ return null;
+ }
+
// avoid duplicate entries
- if (path == null || seenPaths.contains(path)) {
+ if (seenPaths.contains(path)){
+ LOG.trace("Ignoring path {} : Duplicate post transformation", originalPath);
return null;
}
seenPaths.add(path);
}
+ LOG.trace("Matched path {}", path);
return new LuceneResultRow(path, doc.score);
}
return null;
@@ -334,30 +343,40 @@ public class LucenePropertyIndex impleme
TopDocs docs;
long start = PERF_LOGGER.start();
- if (lastDoc != null) {
- LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
- if (sort == null) {
- docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
+ while (true) {
+ if (lastDoc != null) {
+ LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
+ if (sort == null) {
+ docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
+ } else {
+ docs = searcher.searchAfter(lastDoc, query, nextBatchSize, sort);
+ }
} else {
- docs = searcher.searchAfter(lastDoc, query, nextBatchSize, sort);
+ LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
+ if (sort == null) {
+ docs = searcher.search(query, nextBatchSize);
+ } else {
+ docs = searcher.search(query, nextBatchSize, sort);
+ }
}
- } else {
- LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
- if (sort == null) {
- docs = searcher.search(query, nextBatchSize);
- } else {
- docs = searcher.search(query, nextBatchSize, sort);
+ PERF_LOGGER.end(start, -1, "{} ...", docs.scoreDocs.length);
+ nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
+
+ for (ScoreDoc doc : docs.scoreDocs) {
+ LuceneResultRow row = convertToRow(doc, searcher);
+ if (row != null) {
+ queue.add(row);
+ }
+ lastDocToRecord = doc;
}
- }
- PERF_LOGGER.end(start, -1, "...");
- nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
- for (ScoreDoc doc : docs.scoreDocs) {
- LuceneResultRow row = convertToRow(doc, searcher);
- if (row != null) {
- queue.add(row);
+ if (queue.isEmpty() && docs.scoreDocs.length > 0) {
+ //queue is still empty but more results can be fetched
+ //from Lucene so still continue
+ lastDoc = lastDocToRecord;
+ } else {
+ break;
}
- lastDocToRecord = doc;
}
} else if (luceneRequestFacade.getLuceneRequest() instanceof SpellcheckHelper.SpellcheckQuery) {
SpellcheckHelper.SpellcheckQuery spellcheckQuery = (SpellcheckHelper.SpellcheckQuery) luceneRequestFacade.getLuceneRequest();
Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1678954&r1=1678953&r2=1678954&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java Tue May 12 14:17:51 2015
@@ -1280,6 +1280,37 @@ public class LucenePropertyIndexTest ext
assertQuery("select * from [nt:base] where CONTAINS(*, 'jumping')", Collections.<String>emptyList());
}
+ @Test
+ public void relativePropertyAndCursor() throws Exception{
+ // Index Definition
+ Tree idx = createIndex("test1", of("propa", "propb"));
+ TestUtil.useV2(idx);
+ idx.setProperty(LuceneIndexConstants.FULL_TEXT_ENABLED, true);
+
+ Tree propNode = idx.addChild(PROP_NODE);
+
+ // property definition for index test1
+ Tree propA = propNode.addChild("propa");
+ propA.setProperty(LuceneIndexConstants.PROP_TYPE, PropertyType.TYPENAME_STRING);
+ propA.setProperty(LuceneIndexConstants.FIELD_BOOST, 2.0);
+
+ root.commit();
+
+ // create test data with 1 more than batch size
+ //with boost set we ensure that correct result comes *after* the batch size of results
+ Tree test = root.getTree("/").addChild("test");
+ root.commit();
+ for (int i = 0; i < LucenePropertyIndex.LUCENE_QUERY_BATCH_SIZE; i++) {
+ test.addChild("a"+i).addChild("doNotInclude").setProperty("propa", "foo");
+ }
+ test.addChild("b").addChild("jcr:content").setProperty("propb", "foo");
+ root.commit();
+
+ String queryString = "/jcr:root//element(*, nt:base)[jcr:contains(jcr:content, 'foo' )]";
+
+ assertQuery(queryString, "xpath", asList("/test/b"));
+ }
+
private Tree createFileNode(Tree tree, String name, String content, String mimeType){
Tree jcrContent = tree.addChild(name).addChild(JCR_CONTENT);
jcrContent.setProperty(JcrConstants.JCR_DATA, content.getBytes());