【问题标题】:full text queries using "or" in Parse在 Parse 中使用“或”进行全文查询
【发布时间】:2015-03-27 10:49:58
【问题描述】:

问题总结:

在每个 Parse 对象中,我都有一个与该对象相关的关键字列表,作为 NSString 的 NSArray。我希望用户能够输入一个或多个单词并找到在其关键字列表中至少包含其中一个单词的所有对象。由于这将是对整个数据库的搜索,因此需要尽可能高效。

更长的版本/背景:

我正在构建一个 ios objective-c 应用程序,它允许创建和存储矢量图。这些由两个可搜索字段索引。有一个可选的“标签”字段,它必须是完全匹配的——标签可能是“小”、“中”或“大”。还有一个用户在保存绘图时输入的描述字段,例如“绘制一辆红色汽车”或“我的蓝色小汽车”。

根据网络上的建议,我还将描述中的单词存储为 Parse 中的 NSString 的 NSArray,全部小写并删除停用词,称为“关键字”,因此典型的 PFObject 可能是

标签:“小”; 描述:“我的蓝色小汽车”;
关键词:“小”、“蓝色”、“汽车”

我希望用户能够搜索包含“汽车”“汽车”字样的所有记录。他们还应该能够选择性地指定标签字段的内容(例如“small”),它是一个“and”——它会在描述and中找到所有带有“car”或“automobile”的记录> 在标签字段中有“小”。

我可以使用 [query whereKey:@"description" containsString:@"car"] 对描述字段进行搜索,然后对 containsString:@"automobile" 执行相同操作,然后合并结果。这可行,但有两个问题。首先,它不能是索引搜索,因为我们正在字符串中搜索字符串。其次,它需要我手动合并结果。我希望关键字字段将允许更智能的查询。

如何构造对象的字段和用户查询以使其尽可能高效?还有其他建议吗?

谢谢...

【问题讨论】:

  • 你如何“手动合并结果”?
  • 我使用 ObjectID 字段合并列表中的两个结果,因此每个 ObjectID 只出现一次。有些人的描述字段中可能同时包含“汽车”和“汽车”,我不希望该图在匹配对象列表中出现两次。合并本身不是问题,如果他们输入 5 个搜索词,我可能必须进行 5 次不同的搜索,并且我假设每次搜索效率非常低,因为服务器必须检索每个描述字段以查看它是否包含匹配子字符串 - 描述中的单词不是索引。

标签: ios objective-c parse-platform


【解决方案1】:

从您的问题中不清楚您目前如何组合查询,但 Parse 使用orQueryWithSubqueries: 内置了这样做的方法,例如:

[query1 whereKey:@"description" containsString:@"car"];
[query2 whereKey:@"description" containsString:@"automobile"];
PFQuery *combinedQuery = [PFQuery orQueryWithSubqueries:@[query1,query2]];

【讨论】:

  • 谢谢,这比我正在做的(手动合并结果)要好得多!但是我仍然担心 containsString 的效率,因为我看不到“描述”中的单词如何成为数据库索引。告诉我无论如何它是有效的,或者它在实践中不应该是一个问题,或者没有更有效的方法,我很乐意接受你的回答。同时感谢您提供比我目前拥有的更好的解决方案。
  • @PeterWebb 是的, containsString: 的操作比 whereKey:equals: 慢,所以我建议改为搜索关键字数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多