2016-09-07 189 views
0

我想在不使用第三方的情况下实现搜索。我目前的想法是将不同的字符串长度存储为键,以便快速索引。我会实现至少3个字符串长度,并确保搜索的字符串是小写字母。例如在火力数据会是这个样子:索引字符串以方便搜索

{ 
    users: { 
     matUserId: { 
      name: 'Mathew' 
     } 
    }, 
    search: { 
     mat: { 
      users: { matUserId: true } 
     }, 
     ath: { 
      users: { matUserId: true } 
     }, 
     the: { 
      users: { matUserId: true } 
     }, 
     hew: { 
      users: { matUserId: true } 
     }, 
     math: { 
      users: { matUserId: true } 
     }, 
     athe: { 
      users: { matUserId: true } 
     }, 
     thew: { 
      users: { matUserId: true } 
     }, 
     mathe: { 
      users: { matUserId: true } 
     }, 
     athew: { 
      users: { matUserId: true } 
     }, 
     mathew: { 
      users: { matUserId: true } 
     }, 
    } 
} 

我将它扩展的,所以如果有可以搜索他们将共享相同的搜索关键字其他的事情。我相信这会起作用并且速度很快(我有一个基本的实现来检查它),但是想知道这是否是正确的搜索方式或者是否完全离开了基础。举例来说,如果我要搜索“hew”这个词,它只会降低“hew”的子节点,然后我可以获取用户并显示它们。

+0

正确的搜索方式取决于您的用例。但是,之前已经回答过:Firebase实时数据库不是全文搜索引擎。虽然可以模拟一些FTS技术,但它很少是一个完美的选择。如果您想搜索文本,最好使用专用搜索引擎,例如通过我们的手电筒集成。 –

+0

一如既往地感谢弗兰克的回应。有没有可用的工具,不需要我运行一个单独的服务器?在我上面的建议中是否还有任何问题(除了有大量数据)?我不介意它处理非常特定类型的基本字符串搜索。 –

+0

这样的推荐是堆栈溢出的话题,但我在Algolia看到了很好的结果。 –

回答

0

我不喜欢这个建议,因为它导致了一个相当大的数据集。弗兰克范普菲伦的阿尔戈利亚建议,除了我目前对于免费版本的数据太多之外,还能做得很好。我最终只能够通过字符串的开头进行搜索,并创建了一个单独的键以小写形式存储文本。这样我的搜索变得相当简单的查询:

.orderByChild('searchLowerCase').startAt(query.toLowerCase()).endAt(query.toLowerCase() + "\uf8ff") 

这将适合我的需要。