查询在 Apache Geode 中创建的 Lucene 索引

Query Lucene Indexes Created in Apache Geode

使用 documentation 中提供的代码在 Geode 中创建了一个 Lucene 索引。然后将几个对象放入该区域并使用 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();
}

Person 是一个基本的 POJO class,具有三个字段(姓名、薪水、phone)。 我在这里做错了什么?为什么查询结果为空?

事件仍在 AsyncEventQueue 中,尚未刷新到索引中。 (可能需要 10 多毫秒)。 AsyncEventQueue 的默认刷新间隔为 10 毫秒。

您需要在查询之前添加以下代码。 luceneService.waitUntilFlushed("employees", "/测试", 30000, TimeUnit.MILLISECONDS);

如果您只使用 fullName 进行查询,您仍然得不到结果吗?

我认为问题是工资和 phone 被存储为 IntPoint。您可以将它们设为 Person class 中的字符串字段,以便将它们存储为字符串,或者您可以使用整数查询,例如

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

程序中的另一个问题是:

工资字段是一个整数。但是查询尝试对工资字段进行字符串查询并与另一个字符串字段混合。

要查询与字符串字段混合的整数字段,您需要创建一个 LuceneQueryProvider 以将 StringQueryParser 与 IntPoint.newExactQuery(或其他 IntPoint 查询)绑定。

如果只是想尝试基本的功能,暂时只能使用String字段。 (即将工资字段更改为字符串)