我有一个相当大的JSON对象数组(它是一个音乐库,具有诸如艺术家、专辑等属性,并通过loadonce=true向jqgrid提供数据),我想通过整个集合实现类似于lucene(google)的查询 - 但在本地即在浏览器中,不与Web服务器通信。是否有任何JavaScript框架可以帮助我?
我有一个相当大的JSON对象数组(它是一个音乐库,具有诸如艺术家、专辑等属性,并通过loadonce=true向jqgrid提供数据),我想通过整个集合实现类似于lucene(google)的查询 - 但在本地即在浏览器中,不与Web服务器通信。是否有任何JavaScript框架可以帮助我?
浏览您的记录,通过将所有可搜索字段合并为一个名为“index”的字符串字段来创建一次性索引。
将这些索引记录存储在数组中。
按索引对数组进行分区。例如,将所有a的记录放入一个数组中,以此类推。
使用javascript函数indexOf()匹配用户输入的查询,并从分区数组中查找记录。
这是容易的部分,但它将以非常高效的方式支持所有简单的查询,因为索引不必为每个查询重新创建,并且indexOf操作非常高效。我已经用它来搜索了2000条记录。我使用了一个预排序的数组。实际上,这就是Gmail和Yahoo Mail的工作原理。他们在浏览器中存储您的联系人,使用带有索引的预排序数组,使您可以在键入时看到联系人姓名。
这也为您提供了一个基础。现在,您可以在其基础上编写高级查询解析逻辑。例如,支持一些简单的条件关键字,如- AND OR NOT,需要约20-30行自定义JavaScript代码。或者,您可以找到一个JS库,像Lucene一样为您执行解析。
要参考上述逻辑的实现,请查看ZmContactList.js如何对联系人进行自动完成排序和搜索。
你尝试过CouchDB吗?
编辑:
这个怎么样(还可以看看http://jsfiddle.net/7tV3A/1/):
var filtered_collection = [];
var query = 'foo';
$.each(collection, function(i,e){
$.each(e, function(ii, el){
if (el == query) {
filtered_collection.push(e);
}
});
});
当然,(el == query) 部分可以/应该被修改以允许比精确匹配更灵活的搜索模式。