在 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 )
在 Spring Boot 中通过 RestTemplate POST JSON 对象
在 Symfony 中通过 ajax 为 ArrayCollection 数据传递 POST json 对象