我有一大堆JSON对象(它是一个音乐库,其中包含艺术家,专辑等属性,用loadonce = true提供jqgrid)我希望通过整个集合实现类似lucene(google-like)的查询 - 但在本地,即在浏览器中,不与Web服务器通信。是否有任何javascript框架可以帮助我?
答案 0 :(得分:6)
浏览您的记录,通过组合所有搜索来创建一次性索引 在一个名为index的字符串字段中的字段。
将这些索引记录存储在数组中。
在索引上对数组进行分区..就像一个数组中的所有数据一样,等等。
对索引使用javascript函数indexOf()以匹配用户输入的查询,并从分区数组中查找记录。
这是一个简单的部分,但它将以非常有效的方式支持所有简单查询,因为不必为每个查询重新创建索引,并且indexOf操作非常有效。我用它来搜索多达2000条记录。我使用了预先排序的数组。实际上,这就是Gmail和雅虎邮件的工作方式。它们将您的联系人存储在浏览器中的预排序数组中,其中包含一个索引,允许您在键入时查看联系人姓名。
这也为您提供了构建基础。现在,您可以在其上编写高级查询解析逻辑。例如,要支持一些简单的条件关键字,例如 - AND OR NOT,将需要大约20-30行自定义JavaScript代码。或者你可以找到一个JS库,它将像Lucene那样为你解析。
有关上述逻辑的参考实现,请查看ZmContactList.js如何对联系人进行排序和搜索以进行自动完成。
答案 1 :(得分:3)
您可能想要检查FullProof,它确实如此: https://github.com/reyesr/fullproof
答案 2 :(得分:0)
您是否尝试过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 ==查询)部分以允许比完全匹配更灵活的搜索模式。