像Lucene一样在JavaScript中搜索JSON对象

时间:2011-09-23 15:32:23

标签: javascript json lucene indexing

我有一大堆JSON对象(它是一个音乐库,其中包含艺术家,专辑等属性,用loadonce = true提供jqgrid)我希望通过整个集合实现类似lucene(google-like)的查询 - 但在本地,即在浏览器中,不与Web服务器通信。是否有任何javascript框架可以帮助我?

3 个答案:

答案 0 :(得分:6)

  1. 浏览您的记录,通过组合所有搜索来创建一次性索引 在一个名为index的字符串字段中的字段。

  2. 将这些索引记录存储在数组中。

  3. 在索引上对数组进行分区..就像一个数组中的所有数据一样,等等。

  4. 对索引使用javascript函数indexOf()以匹配用户输入的查询,并从分区数组中查找记录。

  5. 这是一个简单的部分,但它将以非常有效的方式支持所有简单查询,因为不必为每个查询重新创建索引,并且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 ==查询)部分以允许比完全匹配更灵活的搜索模式。