ignite - 如何在 Apache Ignite 中链接 SQL、文本和扫描查询
问题描述
我们有一个集群的 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>
推荐阅读
- batch-file - 在批处理文件中获取原始参数或命令
- xml - xmlslurper 按子值从 xml 中删除节点
- python - 比较两个列表中的值,然后计算哪个列表更大
- python - Pandas.plotting.parallel_coordinates 中的绘图顺序
- google-cloud-platform - ./helm init --service-account=tiller 不能在 GCP 上创建一个 tiller 服务帐户
- optimization - CLP 求解器(Coin-Or)的精度是多少?
- javascript - Microsoft Edge 对 canPlayType 上的 AV1 的错误支持
- .net - Windows 10 上的 .NET 4.8 TLS 1.3 问题
- tpm - TPM 设备是否应该同时支持 TPM1.2 和 TPM2.0
- google-sheets - 根据其他列中的选择查找名称