2017-09-25 84 views
1

在Geode中創建了一個Lucene索引,其代碼在documentation中提供。然後在該區域放置幾個對象,並用Lucene查詢查詢該區域,該文檔還顯示了該方法。但查詢結果始終爲空。這裏是我的代碼:查詢在Apache Geode中創建的Lucene索引

啓動的Geode服務器並創建它Lucene索引:在區域和查詢

public static void startServerAndLocator() throws InterruptedException { 
    ServerLauncher serverLauncher = new ServerLauncher.Builder() 
      .setMemberName("server1") 
      .setServerPort(40404) 
      .set("start-locator", "127.0.0.1[10334]") 
      .build(); 

    ServerLauncher.ServerState state = serverLauncher.start(); 
    _logger.info(state.toString()); 

    Cache cache = new CacheFactory().create(); 
    createLuceneIndex(cache); 
    cache.createRegionFactory(RegionShortcut.PARTITION).create("test"); 
} 

public static void createLuceneIndex(Cache cache) throws InterruptedException { 
    LuceneService luceneService = LuceneServiceProvider.get(cache); 
    luceneService.createIndexFactory() 
      .addField("fullName") 
      .addField("salary") 
      .addField("phone") 
      .create("employees", "/test"); 
} 

把對象:

public static void testGeodeServer() throws LuceneQueryException, InterruptedException { 
    ClientCache cache = new ClientCacheFactory() 
      .addPoolLocator("localhost", 10334) 
      .create(); 

    Region<Integer, Person> region = cache 
      .<Integer, Person>createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY).create("test"); 

    List<Person> persons = Arrays.asList(
      new Person("John", 3000, 5556644), 
      new Person("Jane", 4000, 6664488), 
      new Person("Janet", 3500, 1112233)); 

    for (int i = 0; i < persons.size(); i++) { 
     region.put(i, persons.get(i)); 
    } 

    LuceneService luceneService = LuceneServiceProvider.get(cache); 
    LuceneQuery<Integer, Person> query = luceneService.createLuceneQueryFactory() 
      .setLimit(10) 
      .create("employees", "/test", "fullName:John AND salary:3000", "salary"); 

    Collection<Person> values = query.findValues(); 
    System.out.println("Query results:"); 
    for (Person person : values) { 
     System.out.println(person); 
    } 

    cache.close(); 
} 

人是一個基本的POJO類有三個字段(姓名,工資,電話)。 我在這裏做錯了什麼?爲什麼查詢結果是空的?

回答

1

如果使用fullName進行查詢,是否仍然沒有結果?

我認爲問題在於薪水和電話存儲爲IntPoint。你可以在你的Person類中使它們成爲String字段,以便它們可以作爲字符串存儲,或者你可以使用整數查詢,例如。

luceneService.createLuceneQueryFactory() 
    .create("employees", "test", 
     index -> IntPoint.newExactQuery("salary", 30000)) 
0

事件仍在AsyncEventQueue中,但尚未刷新到索引中。 (這可能需要10+毫秒)。 AsyncEventQueue的默認刷新間隔爲10ms。

在查詢之前,您需要添加以下代碼。 luceneService.waitUntilFlushed(「employees」,「/ test」,30000,TimeUnit.MILLISECONDS);

0

在節目中的另一個問題是:

工資字段是一個整數。但查詢嘗試在薪水字段上進行字符串查詢並與另一個字符串字段混合使用。

要在與字符串字段混合的整數字段上進行查詢,您需要創建LuceneQueryProvider以將StringQueryParser與IntPoint.newExactQuery(或其他IntPoint查詢)綁定。

如果您只是想嘗試基本功能,那麼您目前只能使用字符串字段。 (即,將工資字段更改爲字符串)