首页 > 解决方案 > 如何在 Apache Ignite 中链接 SQL、文本和扫描查询

问题描述

我们有一个集群的 Ignite 缓存,我们可以在其中存储大量数据(超过 1 亿条记录)。我们目前正在使用 SQL 查询来使用索引搜索记录。但是我们需要一些基于自由文本的搜索,并且我们计划评估文本查询如何工作。自由文本搜索将结合一些 SQL 约束,因此结果数据集不会很大。我希望找到一种使用文本搜索的方法,并且可以对 SQL 搜索的结果进行扫描搜索(我认为这可以为 Ignite 的查询框架提供更多的灵活性和功能)。有没有办法做到这一点。我们在系统中使用本机持久性和复制缓存。

标签: ignite

解决方案


所有查询类型——扫描、SQL 和文本——彼此独立。您不能直接在文本查询结果之上使用 SQL。

您可以尝试在所有节点上执行本地文本查询,然后手动过滤结果(不使用 SQL,仅使用 Java 代码)。例如

    Collection<List<Cache.Entry<Object, Object>>> results = ignite.compute().broadcast(() -> {
        IgniteCache<Object, Object> cache = Ignition.localIgnite().<Object, Object>cache("foo");
        TextQuery<Object, Object> qry = new TextQuery<Object, Object>(Value.class, "str").setLocal(true);
        try (QueryCursor<Cache.Entry<Object, Object>> cursor = cache.query(qry)) {
            return StreamSupport.stream(cursor.spliterator(), false)
                .filter(e -> needToReturnEntry(e))
                .collect(Collectors.toList());
        }
    });
    List<Cache.Entry<Object, Object>> combinedResults = results.stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

needToReturnEntry(e)这里需要实现与 SQL 约束相同的过滤。

另一种方法是从文本查询中检索主键列表,然后将其添加到 SQL 查询中。如果键的数量不是太大,这将起作用。

select * from TABLE where pKey in (<keys from Text Query>) and <other constraints>

推荐阅读