Javascript:使用多个索引搜索 indexeddb

Posted

技术标签:

【中文标题】Javascript:使用多个索引搜索 indexeddb【英文标题】:Javascript: Searching indexeddb using multiple indexes 【发布时间】:2013-05-06 06:30:49 【问题描述】:

我想从 WebSql 更改为 Indexeddb。但是,如何进行 SQL 查询,例如

SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com'
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com' and age = 30
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com' and name = 'Bill'
etc

使用 IndexedDB 吗? 例如,我在阅读 indexedDb 的documentation 时注意到,所有示例当时只查询一个索引。所以你可以做

var index = objectStore.index("ssn");
index.get("444-44-4444").onsuccess = function(event) 
     alert("Name is " + event.target.result.name);
;

但是我需要同时查询多个索引!

我还发现了一些关于compound indexes 的有趣帖子,但它们只有在查询复合索引中的所有字段时才有效。

【问题讨论】:

In IndexedDB, is there a way to make a sorted compound query?的可能重复 【参考方案1】:

对于您的示例,复合索引仍然有效,但需要两个复合索引

 objectStore.createIndex('ssn, email, age', ['ssn', 'email', 'age']); // corrected
 objectStore.createIndex('ssn, email, name', ['ssn', 'email', 'name'])

这样查询

 keyRange = IDBKeyRange.bound(
     ['444-44-4444', 'bill@bill@company.com'],
     ['444-44-4444', 'bill@bill@company.com', '']) 
 objectStore.index('ssn, email, age').get(keyRange)
 objectStore.index('ssn, email, age').get(['444-44-4444', 'bill@bill@company.com', 30])
 objectStore.index('ssn, email, name').get(['444-44-4444', 'bill@bill@company.com', 'Bill'])

索引可以按任何顺序排列,但如果最具体的在前,则效率最高。

或者,您也可以使用key joining。键连接需要四个(单个)索引。四个索引占用的存储空间更少,更通用。例如,以下查询需要另一个复合索引

SELECT * FROM customers WHERE ssn = '444-44-4444' and name = 'Bill' and age = 30

键连接仍然适用于该查询。

【讨论】:

非常感谢!!但是我仍然无法使用两个索引进行查询。我创建了一个 [jsfiddle.net/jeanluca/sDeGz/](jsfiddle) 来演示这个问题!我还必须将您的 objectStore.index 参数更改为 objectStore.index('ssn', 'email', 'age') 否则我会收到“DOM IDBDatabase Exception 8”异常。 抱歉,我已将index 更正为createIndex。应该没有错误。但请注意,IE10 不支持复合索引。 好的,谢谢。因此,如果我想搜索任何字段组合,我必须为每个组合创建一个索引('ssn'、'ssn、name'、'ssn、email'、ssn、name、email' 等)?索引有多贵?例如,如果我有一个包含 20 个索引的巨大 objectStore? 如果需要key range查询,则必须索引。 20个指标是合理的。但是尽量避免爆炸索引问题developers.google.com/appengine/docs/python/datastore/… 如果我没记错的话,这可能是“键加入”的正确链接:dev.yathit.com/ydn-db/doc/query/key-joining.html

以上是关于Javascript:使用多个索引搜索 indexeddb的主要内容,如果未能解决你的问题,请参考以下文章

Algolia:在 Laravel 中搜索多个索引

来自多个弹性搜索索引的 Kibana 可视化

Elasticsearch:Index boost

Elasticsearch:Index boost

为啥Sql Indexed View总是使用聚集索引

ElasticSearch索引文档写入和近实时搜索