Repository: geode Updated Branches: refs/heads/develop 56d964f86 -> 208f5ae58
GEODE-3206 : Corrected order of lucene search results based on score. This closes #648 Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/208f5ae5 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/208f5ae5 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/208f5ae5 Branch: refs/heads/develop Commit: 208f5ae58c160212aecad82efddecb13f0eb86a6 Parents: 56d964f Author: zhouxh <gz...@pivotal.io> Authored: Fri Jul 21 16:20:14 2017 -0700 Committer: zhouxh <gz...@pivotal.io> Committed: Fri Jul 21 16:20:14 2017 -0700 ---------------------------------------------------------------------- .../internal/cli/LuceneSearchResults.java | 6 +- .../cli/LuceneIndexCommandsDUnitTest.java | 72 ++++++++++++++------ .../cli/LuceneIndexCommandsJUnitTest.java | 49 ++++++------- 3 files changed, 82 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/208f5ae5/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneSearchResults.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneSearchResults.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneSearchResults.java index ba346fe..ff98b8f 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneSearchResults.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneSearchResults.java @@ -55,7 +55,11 @@ public class LuceneSearchResults<K, V> implements Comparable<LuceneSearchResults @Override public int compareTo(final LuceneSearchResults searchResults) { - return Float.compare(getScore(), searchResults.getScore()); + // Lucene search result is compared on score of result. Higher the score more relevant the + // result. + // This comparator is used to list results, order will be higher to lower on score. (Ref. + // GEODE-3206) + return Float.compare(getScore(), searchResults.getScore()) * -1; } public boolean getExeptionFlag() { http://git-wip-us.apache.org/repos/asf/geode/blob/208f5ae5/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java index 009c74c..10409ca 100755 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java @@ -21,6 +21,26 @@ import static org.apache.geode.test.dunit.Assert.assertEquals; import static org.apache.geode.test.dunit.Assert.assertFalse; import static org.apache.geode.test.dunit.Assert.assertTrue; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.core.KeywordAnalyzer; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.awaitility.Awaitility; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + import org.apache.geode.cache.Cache; import org.apache.geode.cache.Region; import org.apache.geode.cache.RegionShortcut; @@ -41,24 +61,6 @@ import org.apache.geode.management.internal.cli.util.CommandStringBuilder; import org.apache.geode.test.dunit.Host; import org.apache.geode.test.dunit.VM; import org.apache.geode.test.junit.categories.DistributedTest; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.core.KeywordAnalyzer; -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.awaitility.Awaitility; -import org.junit.Before; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import junitparams.JUnitParamsRunner; -import junitparams.Parameters; @Category(DistributedTest.class) @RunWith(JUnitParamsRunner.class) @@ -177,7 +179,6 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase { analyzerNames.add(KeywordAnalyzer.class.getCanonicalName()); analyzerNames.add(StandardAnalyzer.class.getCanonicalName()); - CommandStringBuilder csb = new CommandStringBuilder(LuceneCliStrings.LUCENE_CREATE_INDEX); csb.addOption(LuceneCliStrings.LUCENE__INDEX_NAME, INDEX_NAME); csb.addOption(LuceneCliStrings.LUCENE__REGION_PATH, REGION_NAME); @@ -253,7 +254,6 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase { analyzerNames.add(KeywordAnalyzer.class.getCanonicalName()); analyzerNames.add(StandardAnalyzer.class.getCanonicalName()); - CommandStringBuilder csb = new CommandStringBuilder(LuceneCliStrings.LUCENE_CREATE_INDEX); csb.addOption(LuceneCliStrings.LUCENE__INDEX_NAME, INDEX_NAME); csb.addOption(LuceneCliStrings.LUCENE__REGION_PATH, REGION_NAME); @@ -444,6 +444,38 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase { } @Test + public void searchShouldReturnResultsInCorrectOrderOfScore() throws Exception { + final VM vm1 = Host.getHost(0).getVM(1); + + createIndex(vm1); + Map<String, TestObject> entries = new HashMap<>(); + + entries.put("A", new TestObject("jon ", "value2", "value3")); + entries.put("B", new TestObject("don", "EFG", "HIJ")); + entries.put("C", new TestObject("eon", "QWE", "RTY")); + entries.put("D", new TestObject("kion", "QWE", "RTY")); + entries.put("E", new TestObject("ryan", "QWE", "RTY")); + putEntries(vm1, entries, 5); + + CommandStringBuilder csb = new CommandStringBuilder(LuceneCliStrings.LUCENE_SEARCH_INDEX); + csb.addOption(LuceneCliStrings.LUCENE__INDEX_NAME, INDEX_NAME); + csb.addOption(LuceneCliStrings.LUCENE__REGION_PATH, REGION_NAME); + csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__QUERY_STRING, "field1:jon~"); + csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__DEFAULT_FIELD, "field1"); + executeCommandAndLogResult(csb); + + TabularResultData data = (TabularResultData) executeCommandAndGetResult(csb).getResultData(); + assertEquals(4, data.retrieveAllValues("key").size()); + + // confirm the order + List<String> scoreRatings = data.retrieveAllValues("score"); + boolean inOrder = IntStream.range(0, scoreRatings.size() - 1) + .allMatch(index -> scoreRatings.get(index).compareTo(scoreRatings.get(index + 1)) >= 0); + assertTrue("Lucene search result not in expected order", inOrder); + + } + + @Test public void searchShouldReturnNoResults() throws Exception { final VM vm1 = Host.getHost(0).getVM(1); http://git-wip-us.apache.org/repos/asf/geode/blob/208f5ae5/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java index 1adab5a..7d52980 100644 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java @@ -27,6 +27,28 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.core.KeywordAnalyzer; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; + import org.apache.geode.cache.execute.Execution; import org.apache.geode.cache.execute.ResultCollector; import org.apache.geode.cache.lucene.internal.LuceneIndexStats; @@ -47,27 +69,6 @@ import org.apache.geode.management.internal.cli.result.ResultBuilder; import org.apache.geode.management.internal.cli.result.TabularResultData; import org.apache.geode.management.internal.cli.shell.Gfsh; import org.apache.geode.test.junit.categories.UnitTest; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.core.KeywordAnalyzer; -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import junitparams.JUnitParamsRunner; -import junitparams.Parameters; /** * The LuceneIndexCommandsJUnitTest class is a test suite of test cases testing the contract and @@ -275,9 +276,9 @@ public class LuceneIndexCommandsJUnitTest { TabularResultData data = (TabularResultData) result.getResultData(); - assertEquals(Arrays.asList("C", "B", "A"), data.retrieveAllValues("key")); + assertEquals(Arrays.asList("A", "B", "C"), data.retrieveAllValues("key")); assertEquals(Arrays.asList("Result1", "Result1", "Result1"), data.retrieveAllValues("value")); - assertEquals(Arrays.asList("1.1", "1.2", "1.3"), data.retrieveAllValues("score")); + assertEquals(Arrays.asList("1.3", "1.2", "1.1"), data.retrieveAllValues("score")); } @Ignore @@ -366,7 +367,7 @@ public class LuceneIndexCommandsJUnitTest { TabularResultData data = (TabularResultData) result.getResultData(); - assertEquals(Arrays.asList("C", "B", "A"), data.retrieveAllValues("key")); + assertEquals(Arrays.asList("A", "B", "C"), data.retrieveAllValues("key")); } @Test