Xodus 中的子字符串或正则表达式搜索

Substring or regex search in Xodus

我注意到 Xodus 实体浏览器允许搜索以子字符串开头的 属性 值。例如:

firstName ~ Jo

我想知道是否考虑了子字符串或正则表达式搜索。我假设它不存在,因为它需要遍历每个实体。但即使速度很慢,它在实体浏览器中也是一个方便的功能,也许还有一个进度条。有人知道这是否已被考虑过,或者添加它的 PR 是否会被接受?

正则表达式搜索不可用,但子字符串搜索可用。有 StoreTransaction.findStartingWith(..) 方法。子字符串搜索是一种 属性 范围搜索字符串 属性 值。 Searching in Range of Property Values wiki 部分提到了它。

这里有一个test描述了findStartingWith(..)的用法。

至于性能,子字符串搜索不会遍历实体。它使用与 search by property value and property range search 相同的 属性 索引。

为了在字符串"dogcatcow"

中搜索"cat"

我现在能想到的唯一可能的解决方案是创建一个事务并执行:

EntityIterable entities = txn.find(entityType);

从这里开始,它只是标准 Java 迭代并迭代包含关键字 "cat"

的属性

另一个想法 是处理您放入 Xodus 商店的每个 属性。您可以构建一个典型的键值服务,该服务将在保存到商店之前或之后处理(例如使用 Apache Tika 提取单词的文本处理)文本属性。

因此,从您的示例 "dogcatcow" 中,您可以拥有 1 个与 "dog" "cat' and "cow" 链接回实体 [或相反] 的键(因此可能在保存后是创建此索引键的最佳时机。

作为旁注,链接 是 Xodus 与其他数据库的区别,根据我的经验,这在许多情况下非常强大和有用。

从那里开始搜索键就很简单了findWithLinks

示例KV存储可以参考这段代码: https://github.com/divroll/backend/blob/master/src/main/java/com/divroll/backend/service/jee/JeeKeyValueService.java