2017-09-25 13 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(); 
} 

人3の基本的な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

プログラムのもう一つの問題は、次のとおりです。

給与フィールドは整数です。しかし、クエリは、給与フィールドで文字列クエリを実行しようとし、別の文字列フィールドと混在します。

文字列フィールドと混在する整数フィールドを照会するには、StringQueryParserをIntPoint.newExactQuery(または他のIntPoint照会)とバインドするLuceneQueryProviderを作成する必要があります。

基本的な機能を試したい場合は、当面は文字列フィールドしか使用できません。 (給与項目をStringに変更)

関連する問題