【问题标题】:Lucene-like searching through JSON objects in JavaScript在 JavaScript 中通过 JSON 对象进行类似 Lucene 的搜索
【发布时间】:2023-04-04 07:14:01
【问题描述】:

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

【问题讨论】:

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

标签: javascript json lucene indexing


【解决方案1】:
  1. 浏览您的记录,通过组合所有搜索来创建一次性索引 单个字符串字段中的字段称为索引。

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

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

  4. 对索引使用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 - 我们在谈论多少条记录?
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 2011-09-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2011-07-16
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多