我正在尝试同时在多个 Parse 类上实现复杂的全文搜索功能(class1 上的 query1 或 class2 上的 query2 等)。根据Parse's建议最好对字符串进行标记,并在过滤后将其存储在一个数组中,以便可以利用 whereKey:containsAllObjectsInArray:
。
我的问题是:
- 它搜索所有术语而不是任何术语
- 它不搜索子字符串(例如解析数组:
["David", "Peter", "Vivien"]
,搜索vi
返回 0 个对象)
到目前为止,似乎唯一“体面”的方法是将类中的所有字符串连接成一个大字符串并使用 whereKey:containsString:
。我假设这比标记化方法的效率要低。
你们对于如何在多个 Parse 类上开发高效且可扩展的搜索有什么建议或建议吗?
谢谢!
最佳答案
全文搜索是一个复杂的问题,很多数据库都对其有特殊支持,您可以在考虑成本后开启......Parse不支持全文搜索。
关于使用解析执行您想要的操作,whereKey:equalTo:
将在数组上查找其中一项与提供的字符串匹配的位置。
如果您想匹配任何内容,您可以使用 OR query :
PFQuery *term1Query = [[PFQuery queryWithClassName:@"Class"] whereKey:@"terms" equalTo:@"David"];
PFQuery *term2Query = [[PFQuery queryWithClassName:@"Class"] whereKey:@"terms" equalTo:@"Peter"];
PFQuery *query = [PFQuery orQueryWithSubqueries:@[term1Query, term2Query]];
如果您希望能够匹配部分字符串,则需要稍微更改架构。创建一个名为“SearchToken”或其他名称的新类,其中包含字符串类型的“token”列。
确保在创建/更新此内容时始终强制将其转换为小写。然后,您可以在相关类之间共享 token (例如,不要创建两个“david” token ,只需链接到新类上的现有 token )。也强制您的输入为小写,因为所有字符串匹配都区分大小写。
您的“术语”列现在需要包含指针而不仅仅是单词。
您现在可以对“SearchToken”类进行查询,并在父类上使用 whereKey:matchesQuery:
标准,例如:
PFQuery *tokenQuery = [PFQuery queryWithClassName:@"SearchToken"];
[tokenQuery whereKey:@"token" containsString:@"vi"];
PFQuery *mainQuery = [PFQuery queryWithClassName:@"MyClass"];
[mainQuery whereKey:@"terms" matchesQuery:tokenQuery];
您甚至可以使用像上面这样的 or 查询以及完全匹配和部分匹配的混合。
请注意, token 查询可能会匹配许多行,并且受到 100 行默认值的限制,如果您认为需要,请考虑将限制设置得更高,最大值为 1000。
关于创建 SearchToken 行,假设您已经从字符串中收集了 token 并强制它们变为小写,并且现在有要链接/创建的 token :
// these would be generated, manually creating for demonstration
NSArray *tokens = @[@"david", @"and", @"the", @"lion"];
PFQuery *existingTokens [PFQuery queryWithClassName:@"SearchToken"];
[existingTokens whereKey:@"token" containedIn:tokens];
// results of the above already exist, create new rows for the remainder
存在可能存在竞争条件的问题,其中另一个设备可能在查询运行后创建“david” token 。您可以有一个工作来查找重复项并删除重复行,修复所有指针...尽管即使在那里您也想处理竞争条件,因此逻辑可能是标记重复项并让所有其他查询搜索 [query whereKeyDoesNotExist: @"duplicateOf"];
然后查找指向重复项的行的所有记录,并将它们指向 duplicateOf
。一切都取决于避免重复对您来说有多重要,也许这对您来说不是问题。
关于cocoa - Parse.com - 标记化数组字段中的子字符串搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24841236/