我计划在YDN-DB中实现非常简单的全文搜索。我的想法如下:
- 为对象存储的索引使用全文注释模式,从而有效地创建关键字引用表。关键字引用表是与父对象存储的 keyPath 的一对多关系表。关系数据类型是数组,我认为它比引用的多个条目更有效。
- 放置对象时,从索引的值中拆分关键字,并更新引用对象存储的 keyPath 的关键字引用表。
- 要查询全文搜索,请打开关键字引用表的键光标,给出搜索词的范围。该范围将提取所有以给定搜索词开头的关键字。从结果中对应的完整记录取自父对象存储。搜索在单个事务中执行。
稍后键光标可以扩展以包括相关阶段。
实现非常简单,检索应该非常快。
编辑:
在YDN-DB-FULLTEXT 存储库中实现。
特征
- 支持完整语言范围的基于 Unicode 的标记化。
- 英语语言的词干和语音规范化。
- 具有逻辑与、或和接近的自由文本查询基础排名。
- 支持精确匹配和前缀匹配。
- 基于 YDN-DB,存储机制可以是 IndexedDB、WebSQL 或 localStorage。
- 使用全文目录进行简单灵活的配置。
API 参考
使用search
方法查询全文检索。
db.search(catalog, query)
使用 add 或 put 方法将文档在存储到数据库中时进行索引。
查询格式是自由文本,其中隐式和/或/接近逻辑运算符适用于每个令牌。使用双引号进行完全匹配,使用 - 从结果中减去,使用 * 进行前缀搜索。
参数:
{string} catalog
全文搜索目录名称,如架构中所定义。
{string} query
自由文本查询字符串。
回报:
{!ydn.db.Request}
返回一个请求对象。
done: {Array}
返回倒排索引列表。倒排索引具有以下属性:storeName
、primaryKey
、score
、tokens
,分别表示原始文档的存储名称、原始文档的主键、匹配质量分数和令牌对象数组。Token 对象具有以下属性:keyPath
,value
,loc
表示原始文档索引的键路径,原始文档中的原始单词,以及单词在文档中的位置数组列表。
fail: {Error}
如果删除键中的任何一个失败,则会调用失败回调,并在各个元素中产生错误。
progress: {Array}
在索引检索期间,将调度原始倒排索引。
例子
var schema = {
fullTextCatalogs: [{
name: 'name',
lang: 'en',
sources: [
{
storeName: 'contact',
keyPath: 'first'
}],
]},
stores: [
{
name: 'contact',
autoIncrement: true
}]
};
var db = new ydn.db.Storage('db name', schema);
db.put('contact', [{first: 'Jhon'}, {first: 'Collin'}]);
db.search('name', 'jon').done(function(x) {
console.log(x);
db.get(x[0].storeName, x[0].primaryKey).done(function(top) {
console.log(top);
})
});
全文目录
全文目录是一个或多个全文索引的逻辑分组。它在数据库模式中的数据库初始化中定义。
领域:
{string} name
全文目录名称。
{string=} lang
语言。词干、分词和语音规范化是依赖于语言的。lang
必须定义为正确索引。目前仅en
得到很好的支持。如需更多语言,请查看自然
项目 repo。
{Array} indexes
全文索引。storeName
每个索引都通过和对原始文档进行源引用keyPath
。的值keyPath
是要索引的文本。weight
对搜索结果进行排名时应用因素。该值未存储在数据库中,索引后也可以更改。
以下全文目录索引作者姓名first
和last
记录值的字段权重更多first
。
var catalog = {
name: 'author-name',
lang: 'en',
sources: [{
storeName: 'author',
keyPath: 'first',
weight: 1.0
}, {
storeName: 'author',
keyPath: 'last',
weight: 0.8
}]
演示应用程序