Люцен, как поиск объектов JSON в JavaScript

У меня есть довольно большой массив объектов JSON (его музыкальная библиотека со свойствами, такими как художник, альбом и т.д., подающая jqgrid с loadonce = true), и я хочу реализовать запрос типа lucene (google-like) через весь набор - но локально, то есть в браузере, без связи с веб-сервером. Есть ли какие-либо javascript-структуры, которые мне помогут?

Ответ 1

  • Пройдите через свои записи, чтобы создать единовременный индекс, объединив все поисковые запросы способных полей в одном поле строки, называемом индексом.

  • Сохраните эти индексированные записи в массиве.

  • Разделите массив по индексу.. как и все a в одном массиве и т.д.

  • Используйте функцию javascript indexOf() для индекса, чтобы соответствовать запросу, введенному пользователем, и найти записи из многораздельного массива.

Это была легкая часть, но она будет поддерживать все простые запросы очень эффективным образом, потому что индекс не нужно повторно создавать для каждого запроса, а операция indexOf очень эффективна. Я использовал его для поиска до 2000 записей. Я использовал предварительно отсортированный массив. Собственно, это то, как работают почта Gmail и yahoo. Они хранят ваши контакты в браузере в предварительно отсортированном массиве с индексом, который позволяет вам видеть имена контактов при вводе.

Это также дает вам основание для построения. Теперь вы можете написать расширенную логику анализа синтаксиса поверх нее. Например, для поддержки нескольких простых условных ключевых слов, таких как - И ИЛИ НЕ, потребуется около 20-30 строк пользовательского кода JavaScript. Или вы можете найти JS-библиотеку, которая сделает синтаксический анализ для вас так, как делает Lucene.

Для ссылочной реализации вышеуказанной логики посмотрите, как ZmContactList.js сортирует и ищет контакты для автозаполнения.

Ответ 3

Вы пробовали CouchDB?

Edit:

Как насчет чего-то в этом направлении (также см. 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), конечно, может/должна быть изменена, чтобы обеспечить более гибкие шаблоны поиска, чем точное соответствие.