2017-09-25 3 views
1

Erstellt einen Lucene-Index in Geode mit dem Code in documentation bereitgestellt. Dann legte man ein paar Objekte in die Region und befragt die Region mit einer Lucene-Abfrage, deren Dokumentation auch zeigt, wie. Aber das Abfrageergebnis ist immer leer. Hier ist mein Code:Abfrage Lucene Indizes in Apache Geode erstellt

einen Geode-Server starten und Lucene-Index in ihm zu erstellen:

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"); 
} 

Putting Objekte in der Region und anfragende:

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(); 
} 

Person ist eine grundlegende POJO-Klasse mit drei Felder (Name, Gehalt, Telefon). Was mache ich hier falsch? Warum ist das Abfrageergebnis leer?

Antwort

1

Wenn Sie eine Abfrage nur mit FullName ausführen, erhalten Sie immer noch keine Ergebnisse?

Ich denke, das Problem ist, dass Gehalt und Telefon als IntPoint gespeichert werden. Sie könnten sie zu String-Feldern in Ihrer Person-Klasse machen, damit sie als Strings gespeichert werden, oder Sie könnten eine Integer-Abfrage verwenden, z.

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

Die Ereignisse sind immer noch in AsyncEventQueue und noch nicht in den Index gespült. (Es kann 10+ Millisekunden dauern). Das standardmäßige Löschintervall der AsyncEventQueue beträgt 10 ms.

Sie müssen den folgenden Code hinzufügen, bevor Sie die Abfrage ausführen. luceneService.waitUntilFlushed ("Mitarbeiter", "/ test", 30000, TimeUnit.MILLISECONDS);

0

Ein weiteres Problem im Programm:

Das Gehalt Feld eine ganze Zahl ist. Die Abfrage versucht jedoch, eine Zeichenfolgeabfrage für das Gehaltsfeld auszuführen und sie mit einem anderen Zeichenfolgenfeld zu mischen.

Um nach einem Ganzzahlfeld zu suchen, das mit einem Zeichenfolgenfeld gemischt ist, müssen Sie einen LuceneQueryProvider erstellen, um eine StringQueryParser mit einer IntPoint.newExactQuery (oder anderen IntPoint-Abfragen) zu binden.

Wenn Sie nur die grundlegende Funktionalität ausprobieren möchten, können Sie vorläufig nur String-Felder verwenden. (d. h. Ändern des Gehaltsfelds in eine Zeichenfolge)