JavaScript中通过类似Lucene的方式搜索JSON对象

13

我有一个相当大的JSON对象数组(它是一个音乐库,具有诸如艺术家、专辑等属性,并通过loadonce=true向jqgrid提供数据),我想通过整个集合实现类似于lucene(google)的查询 - 但在本地即在浏览器中,不与Web服务器通信。是否有任何JavaScript框架可以帮助我?


你所说的“lucene-like”或“google-like”具体是什么意思?Lucene不仅仅可以进行部分单词自动完成匹配,它是一个完整的框架。 - Dave Newton
1
“Pretty big”并不是很具体的量化描述。我们说的是多少条记录?几百条?几千条?还是几百万条? - vzwick
3个回答

7
  1. 浏览您的记录,通过将所有可搜索字段合并为一个名为“index”的字符串字段来创建一次性索引。

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

  3. 按索引对数组进行分区。例如,将所有a的记录放入一个数组中,以此类推。

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

这是容易的部分,但它将以非常高效的方式支持所有简单的查询,因为索引不必为每个查询重新创建,并且indexOf操作非常高效。我已经用它来搜索了2000条记录。我使用了一个预排序的数组。实际上,这就是Gmail和Yahoo Mail的工作原理。他们在浏览器中存储您的联系人,使用带有索引的预排序数组,使您可以在键入时看到联系人姓名。

这也为您提供了一个基础。现在,您可以在其基础上编写高级查询解析逻辑。例如,支持一些简单的条件关键字,如- AND OR NOT,需要约20-30行自定义JavaScript代码。或者,您可以找到一个JS库,像Lucene一样为您执行解析。

要参考上述逻辑的实现,请查看ZmContactList.js如何对联系人进行自动完成排序和搜索。


你不会愿意提供给我你当前的实现吧?我很想看到它作为一个jQuery插件发布(或者自己将其转化为一个插件)。 - vzwick
ZmContactList.js 是实现,我不能为此负责。 - RHT
有许多优化可以进行,但这里是一个开始:http://jsbin.com/osocig/1/edit - Sukima

3

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 == query) 部分可以/应该被修改以允许比精确匹配更灵活的搜索模式。


不,我希望它在浏览器中执行。 - user961474
在这个例子中,每次查询传递时,小提琴都会索引记录。如果您有大量记录,那么这并不高效。 - RHT
@RHT 你说得完全正确。user961474 - 我们谈论的记录有多少条? - vzwick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接