cocoa - Parse.com - 标记化数组字段中的子字符串搜索

标签 cocoa full-text-search parse-platform

我正在尝试同时在多个 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/

相关文章:

elasticsearch - 使数据可公开搜索

swift - 解析类不是通过 swift 代码创建的

objective-c - 在 Objective-C 中向 NSTableView 添加/删除行

mysql全文搜索作为二级索引

swift - 从 RGB 值创建 CGColor

parsing - 出于地理编码目的解释文本输入的最佳方法是什么?

javascript - Angular 数据绑定(bind)未更新正确的模型范围

javascript - Twilio 测试电话号码无法使用

objective-c - 如何在 Cocoa/Objective C 中通过 NSLog 记录当前行?

cocoa - NSButton 去除文本阴影