如何在 Apache Ignite 中链接 SQL、文本和扫描查询
How to chain SQL, Text and scan queries in Apache Ignite
我们有一个集群 Ignite 缓存,我们计划在其中存储大量数据(超过 1 亿条记录)。我们目前正在使用 SQL 查询来使用索引搜索记录。但是我们需要一些基于自由文本的搜索,我们正计划评估文本查询的工作方式。自由文本搜索将结合一些 SQL 约束,因此结果数据集不会很大。我希望找到一种使用文本搜索的方法,并且可以对 SQL 搜索的结果进行扫描搜索(我认为这可以为 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>
我们有一个集群 Ignite 缓存,我们计划在其中存储大量数据(超过 1 亿条记录)。我们目前正在使用 SQL 查询来使用索引搜索记录。但是我们需要一些基于自由文本的搜索,我们正计划评估文本查询的工作方式。自由文本搜索将结合一些 SQL 约束,因此结果数据集不会很大。我希望找到一种使用文本搜索的方法,并且可以对 SQL 搜索的结果进行扫描搜索(我认为这可以为 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>