在 JavaScript 中通过 JSON 对象进行类似 Lucene 的搜索

Posted

技术标签:

【中文标题】在 JavaScript 中通过 JSON 对象进行类似 Lucene 的搜索【英文标题】:Lucene-like searching through JSON objects in JavaScript 【发布时间】:2011-11-23 18:56:59 【问题描述】:

我有一个相当大的 JSON 对象数组(它是一个音乐库,具有艺术家、专辑等属性,用 loadonce=true 提供 jqgrid),我想通过整个集合实现类似 lucene(类似谷歌)的查询- 但在本地,即在浏览器中,不与网络服务器通信。有什么 javascript 框架可以帮助我吗?

【问题讨论】:

你所说的“类似lucene”或“类似google”到底是什么意思? Lucene 做的不仅仅是部分单词自动完成匹配。这是一个完整的框架。 “相当大”并不完全是一个量化。我们在谈论多少条记录?数百?数千?百万? 【参考方案1】:

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

    将这些索引记录存储在一个数组中。

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

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

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

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

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

【讨论】:

您不会碰巧愿意向我提供您当前的实现,是吗?我很乐意看到它作为一个 jQuery 插件发布(或者我自己把它变成一个,就此而言)... ZmContactList.js 是实现,我不能相信它。 有很多优化可以做,但这里是一个开始:jsbin.com/osocig/1/edit【参考方案2】:

您可能想检查 FullProof,它确实做到了: https://github.com/reyesr/fullproof

【讨论】:

【参考方案3】:

你试过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) 部分,以允许比完全匹配更灵活的搜索模式。

【讨论】:

naaah,我希望它发生在浏览器中。 The fiddle 中的示例每次通过查询时都会索引记录。如果您有大量记录,那效率不高。 @RHT 你完全正确。 user961474 - 我们在谈论多少条记录?

以上是关于在 JavaScript 中通过 JSON 对象进行类似 Lucene 的搜索的主要内容,如果未能解决你的问题,请参考以下文章

在 javascript 中通过 django 模板检索 json 数据时出错,在参数列表后给出 Uncaught SyntaxError: missing )

我如何在 php 中通过 cURL 发布 JSON 对象

在 Spring Boot 中通过 RestTemplate POST JSON 对象

在 Symfony 中通过 ajax 为 ArrayCollection 数据传递 POST json 对象

Electron中实现拖拽文件进div中通过File对象获取文件的路径和内容

Electron中实现拖拽文件进div中通过File对象获取文件的路径和内容