Lucene-подобный поиск по объектам JSON в JavaScript - PullRequest
12 голосов
/ 23 сентября 2011

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

Ответы [ 3 ]

6 голосов
/ 23 сентября 2011
  1. Просмотрите ваши записи, чтобы создать одноразовый индекс, объединив все поля поиска в одном строковом поле, называемом индексом.

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

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

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

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

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

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

3 голосов
/ 04 марта 2013

Возможно, вы захотите проверить FullProof, это именно так: https://github.com/reyesr/fullproof

0 голосов
/ 23 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...