2014-02-20 164 views
3

由于this question中概述的原因,我建立了自己的客户端搜索引擎,而不是使用基于fullproofydn-full-text库。归结起来,fullproof会产生300.000条记录的“太多令人震惊的记录”,而(在发音之后),只有大约7700个独特的词。所以我的“理论”是fullproof是基于其仅适用于服务器端的传统假设:客户端搜索引擎优化

  • 巨大的指标都很好
  • 处理器电源价格昂贵
  • (和处理更长的记录的假设这仅仅是适用于我的情况下,我的记录是平均24个字只有)

而在客户端:

  • 巨大的指数采取年龄来填充
  • 处理能力仍然是有限的,但不是在服务器端

基于这些假设我有一个基本的倒排索引(给刚7700记录作为开始的相对便宜IndexedDB是一个文档/ nosql数据库)。使用兰开斯特词干(这是两种或三种流行词汇中最具侵略性的一种)推测这个倒排索引,并且在搜索期间,我将检索每个词的索引,根据不同索引的重叠和相似度输入单词vs原始(Jaro-Winkler距离)。

问题这种方法的:

  • 结合“popular_word + popular_word”的极其昂贵

所以,终于等到我的问题:我如何能缓解上述问题以最小的增长的索引?我确实明白我的方法是CPU密集型的,但是由于传统的全文搜索索引看起来非常大,这似乎是唯一合理的途径。 (指着我好资源或作品也可以理解)

这是非结构化的文本翻译成小片段,但这种人为的分裂相关领域标准化的或多或少的人为分割所以一直在这里所用好。我还没有研究过将这些“片段”放在一起并在fullproof上投掷大量文本的索引大小的影响。我认为这不会产生巨大的影响,但如果我错了,那么请指出这一点。

回答

3

这是一个很好的问题,感谢您为the IndexedDB tag带来一些质量。

尽管此答案尚未完全准备就绪,但我想告诉您,如果您使用--enable-experimental-web-platform-features启动Chrome,那么应该有一些可用的功能可帮助您实现所期望的功能。

  • IDBObjectStore.openKeyCursor()

      - 价值无涉的游标,如果你能逃脱干只
    • IDBCursor.continuePrimaryKey(key, primaryKey) - 让您使用相同的密钥

    我通过这些通知跳过项目Chrome团队的一名IDB开发人员,虽然我还没有对它们进行实验,但这似乎是一个完美的使用案例。

    我的想法是,如果您在同一列上使用两个不同的索引来解决这个问题,那么您可能能够获得类似于连接的行为,而不会让您的商店出现无用的索引。

    虽然consecutive writes在IDB中非常糟糕,但是阅读很棒。 7700个参赛作品的良好表现应该是相当成功的。

  • +0

    'openKeyCursor'和'continuePrimaryKey'真棒! –

    +0

    continuePrimaryKey这是有些只能在chrome中使用的东西吗?另一种方法是用nextunique或prevunique的方向打开openkeycursor –

    +0

    我还没有完全包围我的头,但我认为'continuePrimaryKey'允许你同时使用两个不同的索引:被查询的索引和“主要”指数。 – buley