You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2016/07/30 00:12:36 UTC

incubator-geode git commit: This closes #220

Repository: incubator-geode
Updated Branches:
  refs/heads/develop 02c6818b4 -> c7530d06b


This closes #220

GEODE-11: Added exception handling to lucene gfsh commands

Added exception handling to lucene search and describe gfsh commands to handle region not found, index not found and invalid query string exceptions.

GEODE-11: gfsh lucene search command returns only keys

Added an option to the lucene search command to return only keys of the search results. Added dunit and junit tests to verify

Signed-off-by: Gester Zhou <gz...@pivotal.io>

GEODE-11: gfsh lucene search command returns only keys

Added an option to the lucene search command to return only keys of the search results. Added dunit and junit tests to verify

Signed-off-by: Gester Zhou <gz...@pivotal.io>


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/c7530d06
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/c7530d06
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/c7530d06

Branch: refs/heads/develop
Commit: c7530d06b6fbd40784b4e2f8d452fffdcfbb50dd
Parents: 02c6818
Author: Aparna Dharmakkan <ad...@pivotal.io>
Authored: Fri Jul 29 14:48:19 2016 -0700
Committer: zhouxh <gz...@pivotal.io>
Committed: Fri Jul 29 17:03:22 2016 -0700

----------------------------------------------------------------------
 .../lucene/internal/cli/LuceneCliStrings.java   |   3 +
 .../internal/cli/LuceneIndexCommands.java       |  70 ++++---
 .../lucene/internal/cli/LuceneIndexDetails.java |   4 +-
 .../lucene/internal/cli/LuceneQueryInfo.java    |   8 +-
 .../internal/cli/LuceneSearchResults.java       |  26 +++
 .../functions/LuceneSearchIndexFunction.java    |  38 ++--
 .../cli/LuceneIndexCommandsDUnitTest.java       | 189 +++++++++++++++++--
 .../cli/LuceneIndexCommandsJUnitTest.java       |  40 +++-
 .../LuceneSearchIndexFunctionJUnitTest.java     |   3 +-
 9 files changed, 315 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneCliStrings.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneCliStrings.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneCliStrings.java
index 15d2ca7..f573bf5 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneCliStrings.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneCliStrings.java
@@ -73,4 +73,7 @@ public class LuceneCliStrings {
   public static final String LUCENE_SEARCH_INDEX__NO_RESULTS_MESSAGE="No results";
   public static final String LUCENE_SEARCH_INDEX__PAGE_SIZE="pageSize";
   public static final String LUCENE_SEARCH_INDEX__PAGE_SIZE__HELP="Number of results to be returned in a page";
+  public static final String LUCENE_SEARCH_INDEX__KEYSONLY="keys-only";
+  public static final String LUCENE_SEARCH_INDEX__KEYSONLY__HELP="Return only keys of search results.";
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommands.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommands.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommands.java
index 0edd2ff..6984f58 100755
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommands.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommands.java
@@ -16,7 +16,6 @@
  */
 package com.gemstone.gemfire.cache.lucene.internal.cli;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -92,7 +91,7 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
     }
     catch (Throwable t) {
       SystemFailure.checkFailure();
-      getCache().getLogger().error(t);
+      getCache().getLogger().info(t);
       return ResultBuilder.createGemFireErrorResult(String.format(LuceneCliStrings.LUCENE_LIST_INDEX__ERROR_MESSAGE,
         toString(t, isDebugging())));
     }
@@ -243,7 +242,7 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
     }
     catch (Throwable t) {
       SystemFailure.checkFailure();
-      getCache().getLogger().error(t);
+      getCache().getLogger().info(t);
       return ResultBuilder.createGemFireErrorResult(String.format(LuceneCliStrings.LUCENE_DESCRIBE_INDEX__ERROR_MESSAGE,
         toString(t, isDebugging())));
     }
@@ -252,8 +251,7 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
   @SuppressWarnings("unchecked")
   protected List<LuceneIndexDetails> getIndexDetails(LuceneIndexInfo indexInfo) throws Exception {
     GeodeSecurityUtil.authorizeRegionManage(indexInfo.getRegionPath());
-    final String[] groups = {};
-    final ResultCollector<?, ?> rc = this.executeFunctionOnGroups(describeIndexFunction, groups, indexInfo);
+    final ResultCollector<?, ?> rc = this.executeFunctionOnGroups(describeIndexFunction, new String[] {}, indexInfo);
     final List<LuceneIndexDetails> funcResults = (List<LuceneIndexDetails>) rc.getResult();
     return funcResults.stream().filter(indexDetails -> indexDetails != null).collect(Collectors.toList());
   }
@@ -287,15 +285,20 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
     @CliOption(key = LuceneCliStrings.LUCENE_SEARCH_INDEX__PAGE_SIZE,
       mandatory = false,
       unspecifiedDefaultValue = "-1",
-      help = LuceneCliStrings.LUCENE_SEARCH_INDEX__PAGE_SIZE__HELP) int pageSize)
+      help = LuceneCliStrings.LUCENE_SEARCH_INDEX__PAGE_SIZE__HELP) int pageSize,
+
+    @CliOption(key = LuceneCliStrings.LUCENE_SEARCH_INDEX__KEYSONLY,
+      mandatory = false,
+      unspecifiedDefaultValue = "false",
+      help = LuceneCliStrings.LUCENE_SEARCH_INDEX__KEYSONLY__HELP) boolean keysOnly)
   {
     try {
-      LuceneQueryInfo queryInfo = new LuceneQueryInfo(indexName, regionPath, queryString, defaultField, limit);
+      LuceneQueryInfo queryInfo = new LuceneQueryInfo(indexName, regionPath, queryString, defaultField, limit, keysOnly);
       if (pageSize == -1) {
         pageSize = Integer.MAX_VALUE;
       }
       searchResults = getSearchResults(queryInfo);
-      return displayResults(pageSize);
+      return displayResults(pageSize, keysOnly);
     }
     catch (FunctionInvocationTargetException ignore) {
       return ResultBuilder.createGemFireErrorResult(CliStrings.format(CliStrings.COULD_NOT_EXECUTE_COMMAND_TRY_AGAIN,
@@ -307,13 +310,13 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
     }
     catch (Throwable t) {
       SystemFailure.checkFailure();
-      getCache().getLogger().error(t);
+      getCache().getLogger().info(t);
       return ResultBuilder.createGemFireErrorResult(String.format(LuceneCliStrings.LUCENE_SEARCH_INDEX__ERROR_MESSAGE,
         toString(t, isDebugging())));
     }
   }
 
-  private Result displayResults(int pageSize) throws IOException {
+  private Result displayResults(int pageSize, boolean keysOnly) throws Exception {
     if (searchResults.size() == 0) {
       return ResultBuilder.createInfoResult(LuceneCliStrings.LUCENE_SEARCH_INDEX__NO_RESULTS_MESSAGE);
     }
@@ -329,7 +332,7 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
     do {
 
       if (!skipDisplay) {
-        CommandResult commandResult = (CommandResult) getResults(fromIndex, toIndex);
+        CommandResult commandResult = (CommandResult) getResults(fromIndex, toIndex, keysOnly);
         if (!pagination) {
           return commandResult;
         }
@@ -395,10 +398,10 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
     return Gfsh.getCurrentInstance();
   }
 
-  private List<LuceneSearchResults> getSearchResults(final LuceneQueryInfo queryInfo) throws CommandResultException {
+  private List<LuceneSearchResults> getSearchResults(final LuceneQueryInfo queryInfo) throws Exception {
     GeodeSecurityUtil.authorizeRegionManage(queryInfo.getRegionPath());
     final String[] groups = {};
-    final ResultCollector<?, ?> rc = this.executeFunctionOnGroups(searchIndexFunction, groups, queryInfo);
+    final ResultCollector<?, ?> rc = this.executeSearch(queryInfo);
     final List<Set<LuceneSearchResults>> functionResults = (List<Set<LuceneSearchResults>>) rc.getResult();
 
     return functionResults.stream()
@@ -407,23 +410,44 @@ public class LuceneIndexCommands extends AbstractCommandsSupport {
       .collect(Collectors.toList());
   }
 
-  private Result getResults(int fromIndex, int toIndex){
+  private Result getResults(int fromIndex, int toIndex, boolean keysonly) throws Exception {
     final TabularResultData data = ResultBuilder.createTabularResultData();
     for (int i = fromIndex; i < toIndex; i++) {
-      data.accumulate("key", searchResults.get(i).getKey());
-      data.accumulate("value", searchResults.get(i).getValue());
-      data.accumulate("score", searchResults.get(i).getScore());
+      if (!searchResults.get(i).getExeptionFlag()) {
+        data.accumulate("key", searchResults.get(i).getKey());
+        if (!keysonly) {
+          data.accumulate("value", searchResults.get(i).getValue());
+          data.accumulate("score", searchResults.get(i).getScore());
+        }
+      }
+      else {
+        throw new Exception(searchResults.get(i).getExceptionMessage());
+      }
     }
     return ResultBuilder.buildResult(data);
   }
 
-  protected ResultCollector<?, ?> executeFunctionOnGroups(FunctionAdapter function, String[]groups, final LuceneIndexInfo indexInfo) throws CommandResultException {
-    final Set<DistributedMember> targetMembers = CliUtil.findAllMatchingMembers(groups, null);
+  protected ResultCollector<?, ?> executeFunctionOnGroups(FunctionAdapter function,
+                                                          String[] groups,
+                                                          final LuceneIndexInfo indexInfo) throws Exception
+  {
+    final Set<DistributedMember> targetMembers;
+    if (function != createIndexFunction) {
+      targetMembers = CliUtil.getMembersForeRegionViaFunction(getCache(), indexInfo.getRegionPath());
+      if (targetMembers.isEmpty()) {
+        throw new Exception("Region not found.");
+      }
+    }
+    else {
+      targetMembers = CliUtil.findAllMatchingMembers(groups, null);
+    }
     return CliUtil.executeFunction(function, indexInfo, targetMembers);
   }
 
-  protected ResultCollector<?, ?> executeFunctionOnGroups(FunctionAdapter function, String[]groups, final LuceneQueryInfo queryInfo) throws CommandResultException {
-    final Set<DistributedMember> targetMembers = CliUtil.findAllMatchingMembers(groups, null);
-    return CliUtil.executeFunction(function, queryInfo, targetMembers);
+  protected ResultCollector<?, ?> executeSearch(final LuceneQueryInfo queryInfo) throws Exception {
+    final Set<DistributedMember> targetMembers = CliUtil.getMembersForeRegionViaFunction(getCache(),queryInfo.getRegionPath());
+    if (targetMembers.isEmpty())
+      throw new Exception("Region not found.");
+    return CliUtil.executeFunction(searchIndexFunction, queryInfo, targetMembers);
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexDetails.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexDetails.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexDetails.java
index cab4c03..5d9c5c6 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexDetails.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexDetails.java
@@ -98,9 +98,9 @@ public class LuceneIndexDetails implements Comparable<LuceneIndexDetails>, Seria
     Map<String, String> results = new HashMap<>();
 
     for (Entry<String, Class<? extends Analyzer>> entry : fieldAnalyzers.entrySet()) {
-      final String analyzer = entry.getValue().getSimpleName();
+      final Class analyzer = entry.getValue();
       if(analyzer != null) {
-        results.put(entry.getKey(), analyzer);
+        results.put(entry.getKey(), analyzer.getSimpleName());
       }
     }
     return results;

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneQueryInfo.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneQueryInfo.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneQueryInfo.java
index 0e5012e..0dbe2fe 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneQueryInfo.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneQueryInfo.java
@@ -28,18 +28,21 @@ public class LuceneQueryInfo implements Serializable {
   private String queryString;
   private String defaultField;
   private int limit;
+  private boolean keysOnly;
 
   public LuceneQueryInfo(final String indexName,
                          final String regionPath,
                          final String queryString,
                          final String defaultField,
-                         final int limit)
+                         final int limit,
+                         final boolean keysOnly)
   {
     this.indexName = indexName;
     this.regionPath = regionPath;
     this.queryString = queryString;
     this.defaultField = defaultField;
     this.limit = limit;
+    this.keysOnly = keysOnly;
   }
 
   public String getIndexName() {
@@ -61,4 +64,7 @@ public class LuceneQueryInfo implements Serializable {
   public int getLimit() {
     if (limit == -1) return LuceneQueryFactory.DEFAULT_LIMIT;
     else return limit; }
+
+  public boolean getKeysOnly() { return keysOnly; }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneSearchResults.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneSearchResults.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneSearchResults.java
index 0748f0a..7f07366 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneSearchResults.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneSearchResults.java
@@ -24,6 +24,9 @@ public class LuceneSearchResults<K,V> implements Comparable<LuceneSearchResults>
   private String key;
   private String value;
   private float score;
+  private boolean exceptionFlag = false;
+  private String exceptionMessage;
+
 
   public LuceneSearchResults(final String key, final String value, final float score) {
     this.key = key;
@@ -31,6 +34,15 @@ public class LuceneSearchResults<K,V> implements Comparable<LuceneSearchResults>
     this.score = score;
   }
 
+  public LuceneSearchResults(final String key) {
+    this.key = key;
+  }
+
+  public LuceneSearchResults(final boolean exceptionFlag, final String exceptionMessage) {
+    this.exceptionFlag=exceptionFlag;
+    this.exceptionMessage=exceptionMessage;
+  }
+
   public String getKey() {
     return key;
   }
@@ -47,4 +59,18 @@ public class LuceneSearchResults<K,V> implements Comparable<LuceneSearchResults>
   public int compareTo(final LuceneSearchResults searchResults) {
     return getScore() < searchResults.getScore() ? -1 : 1;
   }
+
+  public boolean getExeptionFlag() { return exceptionFlag; }
+
+  public String getExceptionMessage() { return exceptionMessage; }
+
+  @Override public String toString() {
+    return "LuceneSearchResults{" +
+      "key='" + key + '\'' +
+      ", value='" + value + '\'' +
+      ", score=" + score +
+      ", exceptionFlag=" + exceptionFlag +
+      ", exceptionMessage='" + exceptionMessage + '\'' +
+      '}';
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunction.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunction.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunction.java
index 8d73790..234583c 100755
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunction.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunction.java
@@ -52,7 +52,7 @@ import com.gemstone.gemfire.internal.InternalEntity;
  * @see LuceneIndexInfo
  */
 @SuppressWarnings("unused")
-public class LuceneSearchIndexFunction<K,V> extends FunctionAdapter implements InternalEntity {
+public class LuceneSearchIndexFunction<K, V> extends FunctionAdapter implements InternalEntity {
 
   protected Cache getCache() {
     return CacheFactory.getAnyInstance();
@@ -62,30 +62,46 @@ public class LuceneSearchIndexFunction<K,V> extends FunctionAdapter implements I
     return LuceneSearchIndexFunction.class.getName();
   }
 
-  public void execute(final FunctionContext context)   {
-
-    Set<LuceneSearchResults> result=new HashSet<>();
+  public void execute(final FunctionContext context) {
+    Set<LuceneSearchResults> result = new HashSet<>();
     final Cache cache = getCache();
     final LuceneQueryInfo queryInfo = (LuceneQueryInfo) context.getArguments();
 
     LuceneService luceneService = LuceneServiceProvider.get(getCache());
     try {
-      if (cache.getRegion(queryInfo.getRegionPath())!=null) {
-        final LuceneQuery<K, V> query = luceneService.createLuceneQueryFactory()
-          .setResultLimit(queryInfo.getLimit())
-          .create(queryInfo.getIndexName(), queryInfo.getRegionPath(), queryInfo.getQueryString(), queryInfo.getDefaultField());
+      if (luceneService.getIndex(queryInfo.getIndexName(), queryInfo.getRegionPath()) == null) {
+        throw new Exception("Index " + queryInfo.getIndexName() + " not found on region " + queryInfo.getRegionPath());
+      }
+      final LuceneQuery<K, V> query = luceneService.createLuceneQueryFactory()
+        .setResultLimit(queryInfo.getLimit())
+        .create(queryInfo.getIndexName(), queryInfo.getRegionPath(), queryInfo.getQueryString(),
+          queryInfo.getDefaultField());
+      if (queryInfo.getKeysOnly()) {
+        query.findKeys().forEach(key -> result.add(new LuceneSearchResults(key.toString())));
+      }
+      else {
         PageableLuceneQueryResults pageableLuceneQueryResults = query.findPages();
         while (pageableLuceneQueryResults.hasNext()) {
           List<LuceneResultStruct> page = pageableLuceneQueryResults.next();
           page.stream()
             .forEach(searchResult ->
-              result.add(new LuceneSearchResults<K,V>(searchResult.getKey().toString(),searchResult.getValue().toString(),searchResult.getScore())));
+              result.add(
+                new LuceneSearchResults<K, V>(searchResult.getKey().toString(), searchResult.getValue().toString(),
+                  searchResult.getScore())));
         }
       }
-      context.getResultSender().lastResult(result);
+      if (result != null) {
+        context.getResultSender().lastResult(result);
+      }
     }
     catch (LuceneQueryException e) {
-      context.getResultSender().lastResult(e);
+      result.add(new LuceneSearchResults(true, e.getRootCause().getMessage()));
+      context.getResultSender().lastResult(result);
+    }
+    catch (Exception e) {
+      result.add(new LuceneSearchResults(true, e.getMessage()));
+      context.getResultSender().lastResult(result);
     }
   }
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java
index 141063f..bdede47 100755
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java
@@ -41,8 +41,10 @@ import org.apache.lucene.analysis.core.KeywordAnalyzer;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.search.Collector;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
+import org.junit.rules.ExpectedException;
 
 import static com.gemstone.gemfire.cache.lucene.test.LuceneTestUtilities.*;
 import static com.gemstone.gemfire.test.dunit.Assert.*;
@@ -63,6 +65,7 @@ import java.util.stream.Collectors;
 @Category(DistributedTest.class)
 public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase {
 
+
   @Before
   public void createJMXManager() {
     disconnectAllFromDS();
@@ -111,12 +114,7 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase {
   public void listIndexShouldReturnCorrectStatus() throws Exception {
     final VM vm1 = Host.getHost(0).getVM(1);
 
-    vm1.invoke(() -> {
-      LuceneService luceneService = LuceneServiceProvider.get(getCache());
-      Map<String, Analyzer> fieldAnalyzers = new HashMap();
-      fieldAnalyzers.put("field1", new StandardAnalyzer());
-      luceneService.createIndex(INDEX_NAME, REGION_NAME, fieldAnalyzers);
-    });
+    createIndexWithoutRegion(vm1);
     CommandManager.getInstance().add(LuceneIndexCommands.class.newInstance());
 
     CommandStringBuilder csb = new CommandStringBuilder(LuceneCliStrings.LUCENE_LIST_INDEX);
@@ -298,18 +296,37 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase {
   }
 
   @Test
+  public void describeIndexWithoutRegionShouldReturnError() throws Exception {
+
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    createIndexWithoutRegion(vm1);
+    CommandStringBuilder csb = new CommandStringBuilder(LuceneCliStrings.LUCENE_DESCRIBE_INDEX);
+    csb.addOption(LuceneCliStrings.LUCENE__INDEX_NAME,"notAnIndex");
+    csb.addOption(LuceneCliStrings.LUCENE__REGION_PATH,REGION_NAME);
+
+    String commandString = csb.toString();
+    writeToLog("Command String :\n ", commandString);
+    CommandResult commandResult = executeCommand(commandString);
+    String resultAsString = commandResultToString(commandResult);
+    writeToLog("Result String :\n ", resultAsString);
+    assertEquals(Status.ERROR, commandResult.getStatus());
+    assertTrue(resultAsString.contains("Region not found"));
+  }
+
+  @Test
   public void searchShouldReturnCorrectResults() throws Exception {
     final VM vm1 = Host.getHost(0).getVM(1);
 
     createIndex(vm1);
     Map<String,TestObject> entries=new HashMap<>();
-    entries.put("A",new TestObject("field1:value1 ","field2:value2","field3:value3"));
+    entries.put("A",new TestObject("value1 ","value2","value3"));
     entries.put("B",new TestObject("ABC","EFG","HIJ"));
-    entries.put("C",new TestObject("field1:value1","QWE","RTY"));
+    entries.put("C",new TestObject("value1","QWE","RTY"));
     entries.put("D",new TestObject("ABC","EFG","HIJ"));
-    entries.put("E",new TestObject("field1 :value1","ABC","EFG"));
+    entries.put("E",new TestObject("value1","ABC","EFG"));
     entries.put("F",new TestObject("ABC","EFG","HIJ"));
-    entries.put("G",new TestObject("field1: value1","JKR","POW"));
+    entries.put("G",new TestObject(" value1","JKR","POW"));
     entries.put("H",new TestObject("ABC","EFG","H2J"));
     putEntries(vm1,entries,8);
 
@@ -330,13 +347,13 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase {
 
     createIndex(vm1);
     Map<String,TestObject> entries=new HashMap<>();
-    entries.put("A",new TestObject("field1:value1 ","field2:value2","field3:value3"));
+    entries.put("A",new TestObject("value1 ","value2","value3"));
     entries.put("B",new TestObject("ABC","EFG","HIJ"));
-    entries.put("C",new TestObject("field1:value1","QWE","RTY"));
+    entries.put("C",new TestObject("value1","QWE","RTY"));
     entries.put("D",new TestObject("ABC","EFG","HIJ"));
-    entries.put("E",new TestObject("field1 :value1","ABC","EFG"));
+    entries.put("E",new TestObject(":value1","ABC","EFG"));
     entries.put("F",new TestObject("ABC","EFG","HIJ"));
-    entries.put("G",new TestObject("field1: value1","JKR","POW"));
+    entries.put("G",new TestObject(" value1","JKR","POW"));
     entries.put("H",new TestObject("ABC","EFG","H2J"));
     putEntries(vm1,entries,8);
 
@@ -357,13 +374,13 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase {
 
     createIndex(vm1);
     Map<String,TestObject> entries=new HashMap<>();
-    entries.put("A",new TestObject("field1:value1 ","field2:value2","field3:value3"));
+    entries.put("A",new TestObject("value1 ","value2","value3"));
     entries.put("B",new TestObject("ABC","EFG","HIJ"));
-    entries.put("C",new TestObject("field1:value1","QWE","RTY"));
+    entries.put("C",new TestObject("value1","QWE","RTY"));
     entries.put("D",new TestObject("ABC","EFG","HIJ"));
-    entries.put("E",new TestObject("field1 :value1","ABC","EFG"));
+    entries.put("E",new TestObject("value1","ABC","EFG"));
     entries.put("F",new TestObject("ABC","EFG","HIJ"));
-    entries.put("G",new TestObject("field1: value1","JKR","POW"));
+    entries.put("G",new TestObject(" value1","JKR","POW"));
     entries.put("H",new TestObject("ABC","EFG","H2J"));
     putEntries(vm1,entries,8);
 
@@ -378,6 +395,131 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase {
     assertEquals(2,data.retrieveAllValues("key").size());
   }
 
+  @Test
+  public void searchWithoutFieldNameShouldReturnCorrectResults() throws Exception {
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    createIndex(vm1);
+    Map<String,TestObject> entries=new HashMap<>();
+    entries.put("A",new TestObject("value1 ","value2","value3"));
+    entries.put("B",new TestObject("ABC","EFG","HIJ"));
+    entries.put("C",new TestObject("value1","QWE","RTY"));
+    entries.put("D",new TestObject("ABC","EFG","HIJ"));
+    entries.put("E",new TestObject("value1","ABC","EFG"));
+    entries.put("F",new TestObject("ABC","EFG","HIJ"));
+    entries.put("G",new TestObject("value1","JKR","POW"));
+    entries.put("H",new TestObject("ABC","EFG","H2J"));
+    putEntries(vm1,entries,8);
+
+    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,"QWE");
+    csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__DEFAULT_FIELD,"field2");
+    executeCommandAndLogResult(csb);
+
+    TabularResultData data = (TabularResultData) executeCommandAndGetResult(csb).getResultData();
+    assertEquals(1,data.retrieveAllValues("key").size());
+  }
+
+  @Test
+  public void searchWithInvalidQueryStringShouldReturnError() throws Exception {
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    createIndex(vm1);
+    Map<String,TestObject> entries=new HashMap<>();
+    entries.put("A",new TestObject("value1 ","value2","value3"));
+    entries.put("B",new TestObject("ABC","EFG","HIJ"));;
+    putEntries(vm1,entries,2);
+
+    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,"WF~*");
+    csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__DEFAULT_FIELD,"field2");
+
+    String commandString = csb.toString();
+    writeToLog("Command String :\n ", commandString);
+    CommandResult commandResult = executeCommand(commandString);
+    String resultAsString = commandResultToString(commandResult);
+    writeToLog("Result String :\n ", resultAsString);
+    assertEquals(Status.ERROR, commandResult.getStatus());
+    assertTrue(resultAsString.contains("Leading wildcard is not allowed: field2:*"));
+  }
+
+  @Test
+  public void searchOnIndexWithoutRegionShouldReturnError() throws Exception {
+
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    createIndexWithoutRegion(vm1);
+    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, "EFG");
+    csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__DEFAULT_FIELD, "field2");
+
+    String commandString = csb.toString();
+    writeToLog("Command String :\n ", commandString);
+    CommandResult commandResult = executeCommand(commandString);
+    String resultAsString = commandResultToString(commandResult);
+    writeToLog("Result String :\n ", resultAsString);
+    assertEquals(Status.ERROR, commandResult.getStatus());
+    assertTrue(resultAsString.contains("Region not found"));
+
+  }
+
+  @Test
+  public void searchWithoutIndexShouldReturnError() throws Exception {
+
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    vm1.invoke(() -> createRegion());
+
+    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, "EFG");
+    csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__DEFAULT_FIELD, "field2");
+
+    String commandString = csb.toString();
+    writeToLog("Command String :\n ", commandString);
+    CommandResult commandResult = executeCommand(commandString);
+    String resultAsString = commandResultToString(commandResult);
+    writeToLog("Result String :\n ", resultAsString);
+    assertEquals(Status.ERROR, commandResult.getStatus());
+    assertTrue(resultAsString.contains("Index "+INDEX_NAME+" not found"));
+  }
+
+  @Test
+  public void searchIndexShouldReturnCorrectKeys() throws Exception {
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    createIndex(vm1);
+    Map<String,TestObject> entries=new HashMap<>();
+    entries.put("A",new TestObject("value1 ","value2","value3"));
+    entries.put("B",new TestObject("ABC","EFG","HIJ"));
+    entries.put("C",new TestObject("value1","QWE","RTY"));
+    entries.put("D",new TestObject("ABC","EFG","HIJ"));
+    entries.put("E",new TestObject("value1","ABC","EFG"));
+    entries.put("F",new TestObject("ABC","EFG","HIJ"));
+    entries.put("G",new TestObject("value1","JKR","POW"));
+    entries.put("H",new TestObject("ABC","EFG","H2J"));
+    putEntries(vm1,entries,8);
+
+    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,"value1");
+    csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__DEFAULT_FIELD,"field1");
+    csb.addOption(LuceneCliStrings.LUCENE_SEARCH_INDEX__KEYSONLY,"true");
+    executeCommandAndLogResult(csb);
+
+    TabularResultData data = (TabularResultData) executeCommandAndGetResult(csb).getResultData();
+    assertEquals(4,data.retrieveAllValues("key").size());
+
+  }
+
   private void createRegion() {
     getCache().createRegionFactory(RegionShortcut.PARTITION).create(REGION_NAME);
   }
@@ -414,6 +556,17 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase {
     });
   }
 
+  private void createIndexWithoutRegion(final VM vm1) {
+    vm1.invoke(() -> {
+      LuceneService luceneService = LuceneServiceProvider.get(getCache());
+      Map<String, Analyzer> fieldAnalyzers = new HashMap();
+      fieldAnalyzers.put("field1", new StandardAnalyzer());
+      fieldAnalyzers.put("field2", new KeywordAnalyzer());
+      fieldAnalyzers.put("field3", null);
+      luceneService.createIndex(INDEX_NAME, REGION_NAME, fieldAnalyzers);
+    });
+  }
+
   private void writeToLog(String text, String resultAsString) {
     System.out.println(text + ": " + getTestMethodName() + " : ");
     System.out.println(text + ":" + resultAsString);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java
index 09cd737..81f0025 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/LuceneIndexCommandsJUnitTest.java
@@ -19,8 +19,6 @@ import static org.junit.Assert.*;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.*;
 
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -45,7 +43,6 @@ import com.gemstone.gemfire.cache.lucene.internal.LuceneIndexStats;
 import com.gemstone.gemfire.cache.lucene.internal.cli.functions.LuceneCreateIndexFunction;
 import com.gemstone.gemfire.cache.lucene.internal.cli.functions.LuceneDescribeIndexFunction;
 import com.gemstone.gemfire.cache.lucene.internal.cli.functions.LuceneListIndexFunction;
-import com.gemstone.gemfire.cache.lucene.internal.cli.functions.LuceneSearchIndexFunction;
 import com.gemstone.gemfire.distributed.DistributedMember;
 import com.gemstone.gemfire.internal.cache.execute.AbstractExecution;
 import com.gemstone.gemfire.internal.util.CollectionUtils;
@@ -154,7 +151,7 @@ public class LuceneIndexCommandsJUnitTest {
   }
 
   @Test
-  public void testCreateIndex() throws CommandResultException {
+  public void testCreateIndex() throws Exception {
     final Cache mockCache=mock(Cache.class);
     final ResultCollector mockResultCollector = mock(ResultCollector.class);
     final LuceneIndexCommands commands=spy(createIndexCommands(mockCache,null));
@@ -181,7 +178,7 @@ public class LuceneIndexCommandsJUnitTest {
   }
 
   @Test
-  public void testDescribeIndex() throws CommandResultException {
+  public void testDescribeIndex() throws Exception {
 
     final Cache mockCache = mock(Cache.class, "Cache");
     final ResultCollector mockResultCollector = mock(ResultCollector.class, "ResultCollector");
@@ -214,7 +211,7 @@ public class LuceneIndexCommandsJUnitTest {
   }
 
   @Test
-  public void testSearchIndex() throws CommandResultException {
+  public void testSearchIndex() throws Exception {
 
     final Cache mockCache = mock(Cache.class, "Cache");
     final ResultCollector mockResultCollector = mock(ResultCollector.class, "ResultCollector");
@@ -226,10 +223,10 @@ public class LuceneIndexCommandsJUnitTest {
     queryResults.add(createQueryResults("B","Result1",Float.valueOf("1.2")));
     queryResults.add(createQueryResults("C","Result1",Float.valueOf("1.1")));
     queryResultsList.add(queryResults);
-    doReturn(mockResultCollector).when(commands).executeFunctionOnGroups(isA(LuceneSearchIndexFunction.class),any(),any(LuceneQueryInfo.class));
+    doReturn(mockResultCollector).when(commands).executeSearch(isA(LuceneQueryInfo.class));
     doReturn(queryResultsList).when(mockResultCollector).getResult();
 
-    CommandResult result = (CommandResult) commands.searchIndex("index","region","Result1","field1",-1,-1);
+    CommandResult result = (CommandResult) commands.searchIndex("index","region","Result1","field1",-1,-1, false);
 
     TabularResultData data = (TabularResultData) result.getResultData();
 
@@ -255,7 +252,7 @@ public class LuceneIndexCommandsJUnitTest {
     LuceneSearchResults result7=createQueryResults("G","Result1",Float.valueOf("1.1"));
     final List<Set<LuceneSearchResults>> queryResultsList = getSearchResults(result1, result2, result3, result4, result5, result6, result7);
 
-    doReturn(mockResultCollector).when(commands).executeFunctionOnGroups(isA(LuceneSearchIndexFunction.class),any(),any(LuceneQueryInfo.class));
+    doReturn(mockResultCollector).when(commands).executeSearch(any(LuceneQueryInfo.class));
     doReturn(queryResultsList).when(mockResultCollector).getResult();
     doReturn(mockGfsh).when(commands).initGfsh();
     when(mockGfsh.interact(anyString())).thenReturn("n").thenReturn("n").thenReturn("n").thenReturn("n")
@@ -267,7 +264,7 @@ public class LuceneIndexCommandsJUnitTest {
     String expectedPage3 = getPage(expectedResults, new int[] {4,5});
     String expectedPage4 = getPage(expectedResults, new int[] {6});
 
-    commands.searchIndex("index","region","Result1","field1",-1,2);
+    commands.searchIndex("index","region","Result1","field1",-1,2,false);
     verify(mockGfsh, times(20)).printAsInfo(resultCaptor.capture());
     List<String> actualPageResults=resultCaptor.getAllValues();
 
@@ -304,6 +301,29 @@ public class LuceneIndexCommandsJUnitTest {
 
   }
 
+  @Test
+  public void testSearchIndexWithKeysOnly() throws Exception {
+
+    final Cache mockCache = mock(Cache.class, "Cache");
+    final ResultCollector mockResultCollector = mock(ResultCollector.class, "ResultCollector");
+    final LuceneIndexCommands commands=spy(createIndexCommands(mockCache,null));
+
+    final List<Set<LuceneSearchResults>> queryResultsList = new ArrayList<>();
+    HashSet<LuceneSearchResults> queryResults = new HashSet<>();
+    queryResults.add(createQueryResults("A","Result1",Float.valueOf("1.3")));
+    queryResults.add(createQueryResults("B","Result1",Float.valueOf("1.2")));
+    queryResults.add(createQueryResults("C","Result1",Float.valueOf("1.1")));
+    queryResultsList.add(queryResults);
+    doReturn(mockResultCollector).when(commands).executeSearch(isA(LuceneQueryInfo.class));
+    doReturn(queryResultsList).when(mockResultCollector).getResult();
+
+    CommandResult result = (CommandResult) commands.searchIndex("index","region","Result1","field1",-1,-1, true);
+
+    TabularResultData data = (TabularResultData) result.getResultData();
+
+    assertEquals(Arrays.asList("C","B","A"), data.retrieveAllValues("key"));
+  }
+
   private String getPage(final LuceneSearchResults[] expectedResults, int[] indexList) {
     final TabularResultData data = ResultBuilder.createTabularResultData();
     for (int i:indexList) {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c7530d06/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunctionJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunctionJUnitTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunctionJUnitTest.java
index f3e970f..68871f9 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunctionJUnitTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/cli/functions/LuceneSearchIndexFunctionJUnitTest.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import com.gemstone.gemfire.cache.Region;
 import com.gemstone.gemfire.cache.execute.FunctionContext;
 import com.gemstone.gemfire.cache.execute.ResultSender;
+import com.gemstone.gemfire.cache.lucene.LuceneIndex;
 import com.gemstone.gemfire.cache.lucene.LuceneQuery;
 import com.gemstone.gemfire.cache.lucene.LuceneQueryException;
 import com.gemstone.gemfire.cache.lucene.LuceneQueryFactory;
@@ -82,13 +83,13 @@ public class LuceneSearchIndexFunctionJUnitTest {
   private InternalLuceneService getMockLuceneService(String resultKey, String resultValue, String resultScore) throws LuceneQueryException{
     InternalLuceneService service=mock(InternalLuceneService.class);
     LuceneQueryFactory mockQueryFactory = spy(LuceneQueryFactory.class);
-    LuceneQueryFactory mockQueryFactory2 = mock(LuceneQueryFactory.class);
     LuceneQuery mockQuery=mock(LuceneQuery.class);
     PageableLuceneQueryResults pageableLuceneQueryResults = mock(PageableLuceneQueryResults.class);
     LuceneResultStruct<String,String> resultStruct = new LuceneResultStructImpl(resultKey,resultValue,Float.valueOf(resultScore));
     List<LuceneResultStruct<String,String>> queryResults= new ArrayList<>();
     queryResults.add(resultStruct);
 
+    doReturn(mock(LuceneIndex.class)).when(service).getIndex(anyString(),anyString());
     doReturn(mockQueryFactory).when(service).createLuceneQueryFactory();
     doReturn(mockQueryFactory).when(mockQueryFactory).setResultLimit(anyInt());
     doReturn(mockQuery).when(mockQueryFactory).create(any(),any(),any(),any());