我使用YDN-DB(IndexedDB之上的抽象)作为本地数据库。我有一个名为'对话的对象商店,在那个商店里,有一个名为'参与者'其中有一个字符串,其中包含对话中不同用户的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!
});
这是有道理的,当reading the documentation时,在' - '和' *'是保留字符,分别删除短语并匹配前缀:
查询格式是自由文本,其中隐式和/或/近似逻辑运算符适用于每个标记。使用双引号进行精确匹配, - 从结果中减去,使用*进行前缀搜索。
我尝试在单引号中加入双引号,只使用双引号,并且还转义了所有的' - '带有反斜杠的字符,但这些字符似乎都不起作用。
所以问题是如何在索引中执行匹配,其中字符串包含' - '字符吗
答案 0 :(得分:1)
您是否尝试db.search('participants', '"d7fa26b3"')
。
顺便说一下,您使用的是全文搜索功能。您必须对字符串进行标记并手动索引它们。
答案 1 :(得分:1)
如果将对象的参与者字段存储为数组,则可以使用参与者字段上调用的createIndex方法的多条目标记,并可能执行您想要的操作。
对象的participant属性中的项目数是可变的。当您更新商店中的对象并且它在partic属性中具有不同数量的项目时,索引会自动更新为结果(就像任何其他索引一样)。如果你在prop中添加一个项目,然后恢复(put / override / cursor.update)商店中的对象,索引会更新。
有助于回顾多条目索引如何工作的基础知识。你可以使用vanilla js,没有框架,当然也没有全文搜索。