对象化数据存储中的过滤子字符串

Objectify filtering substrings in Datastore

我需要创建一个能够在单词中搜索字母的高级 Query Filter

例如,如果我为 Angel 找到单词 gel,它将执行匹配过滤器。

Filter propertyFilter =  new FilterPredicate("name", FilterOperator.EQUAL, name);

Query<User> result = ObjectifyService.ofy().load().type(User.class)
                    .filter(propertyFilter);

Query 仅当单词等于匹配项时才有效。

数据存储不适合这种事情。进行前缀匹配或后缀匹配非常简单,但是字符串中间的任意文本需要索引每个可以匹配的片段;例如,Angel 变为 [Angel, ngel, gel, el, l]。存储所有这些数据有点昂贵,而且它不能很好地扩展到长字符串。

GAE 的搜索 API 往往更适合这种事情,并且更有效地存储索引。

顺便说一句,这对数据库来说是个难题。 RDBMSes 将 LIKE '%gel%' 转换为 table 扫描,仅适用于小型数据集。全文搜索引擎通常只搜索单词,而不搜索内部子字符串。