0

我使用 YDN-DB(IndexedDB 之上的抽象)作为本地数据库。我有一个名为“conversations”的对象存储,在该存储中,有一个名为“participants”的索引,其中有一个包含对话中不同用户的 id 的字符串。例如:

示例对话#1:

id: 1234343434353456,
participants: '171e66ca-207f-4ba9-8197-d1dac32499db,82be80e2-2831-4f7d-a8d7-9223a2d4d511'

示例对话#2:

id: 4321343434356543,
participants: 'd7fa26b3-4ecc-4f84-9271-e15843fcc83f,171e66ca-207f-4ba9-8197-d1dac32499db'

为了尝试对索引执行部分匹配,我尝试使用 ydn-db-fulltext 作为解决方案。全文目录如下所示:

  {
    name: 'participants',
    lang: 'en',
    sources: [
      {
        storeName: 'conversations',
        keyPath: 'participants',
        weight: 1
      }
    ]
  }

我看到目录已生成,但在进行完全匹配时似乎存在问题。例如,如果我只使用参与者索引中的部分键进行查询,我会从目录中取回一个主键:

db.search('participants', 'd7fa26b3').done(function(results) {
  if(results.length == 0) console.debug('No results found...');
  console.debug(results);                  // there is 1 object here!
  var primaryKey = results[0].primaryKey;  // primaryKey exists!
});

但是,当使用任何超过“-”的值时,搜索请求会返回 0 个结果:

db.search('participants', 'd7fa26b3-4ecc-4f84-9271-e15843fcc83f').done(function(results) {
  if(results.length == 0) console.debug('No results found...');
  console.debug(results);                  // there are 0 objects in the array
  var primaryKey = results[0].primaryKey;  // primaryKey throws undefined since there are 0 results!
});

这是有道理的,在阅读文档时,'-' 和 '*' 是保留字符,它们分别删除短语并匹配前缀:

查询格式是自由文本,其中隐式和/或/接近逻辑运算符适用于每个令牌。使用双引号进行完全匹配,使用 - 从结果中减去,使用 * 进行前缀搜索。

我尝试将双引号放在单引号内,仅使用双引号,并用反斜杠转义所有“-”字符,但这些似乎都不起作用。

所以问题是如何在字符串包含“-”字符的索引中执行匹配?

4

2 回答 2

1

如果您将对象的参与者字段存储为数组,那么您可以对参与者字段上调用的 createIndex 方法使用多条目标志,并且可能执行您想要的操作。

对象的参与者属性中的项目数是可变的。当您更新存储中的对象并且它在 partic 属性中具有不同数量的项目时,索引会作为结果自动更新(就像任何其他索引一样)。如果您将项目添加到道具,然后恢复(put/override/cursor.update)存储中的对象,则索引会更新。

它有助于回顾多条目索引如何工作的基础知识。你可以用 vanilla js 做到这一点,没有框架,当然也没有全文搜索。

于 2014-07-18T18:32:21.660 回答
1

你试试db.search('participants', '"d7fa26b3"')

顺便说一句,您正在使用不应该做的全文搜索。您必须标记您的字符串并手动索引它们。

于 2014-07-17T23:54:03.737 回答