2014-02-20 2 views
3

Из-за причин, изложенных в this question. Я создаю свою собственную поисковую машину на стороне клиента, а не используя библиотеку ydn-full-text, которая основана на fullproof. То, что это сводится к тому, что fullproof порождает «слишком большое количество записей» в размере 300 000 записей, а после (после его окончания) всего около 7700 уникальных слов. Так что моя «теория» является то, что fullproof основан на традиционных допущениях, которые распространяются только на стороне сервера:Оптимизация поисковой системы на стороне клиента

  • Огромные индексы прекрасны
  • мощность процессора дорого
  • (и предположение о работе с более длинными записями который только применимо к моему случаю, когда мои записи в среднем 24 слов только)

в то время как на стороне клиента:

  • Огромные индексы принимают возраст для заполнения
  • Обработки мощности по-прежнему ограничена, но сравнительно дешевле, чем на стороне сервера

Исходя из этих предположений, я начал не с элементарным инвертированным индексом (дают только 7700 записи, как IndexedDB - это база данных document/nosql). Этот инвертированный индекс был создан с использованием стэнмера Ланкастера (наиболее агрессивного из двух или трех популярных), и во время поиска я бы получил индекс для каждого слова, назначил оценку, основанную на перекрытии разных индексов и на сходстве типичного слова против оригинала (расстояние Яро-Винклера).

Проблема этого подхода:

  • Комбинация «popular_word + popular_word» очень дорого

Итак, наконец-то на мой вопрос: Как я могу облегчить вышеупомянутую проблему с минимальным ростом индекса? Я понимаю, что мой подход будет интенсивным, но как традиционный полнотекстовый индекс поиска кажется необычно большим, это, по-видимому, единственный разумный путь. (Показывая мне хорошие ресурсы или произведение также оценил)

Это более или менее искусственное расщепление неструктурированных текстов на небольшие сегменты, однако это искусственное расщепление стандартизировано в соответствующей области, так было использовано здесь Что ж. Я не изучал влияние на индексный размер хранения этих «фрагментов» и бросал огромные куски текстов по адресу fullproof. Я предполагаю, что это не будет иметь большого значения, но если я ошибаюсь, пожалуйста, укажите это.

ответ

3

Это отличный вопрос, спасибо за то, что принесли какое-то качество в the IndexedDB tag.

Хотя этот ответ не совсем готов к производству, я хотел сообщить вам, что если вы запустите Chrome с помощью --enable-experimental-web-platform-features, тогда должно быть несколько функций, которые могут помочь вам достичь того, что вы хотите сделать.

  • IDBObjectStore.openKeyCursor() - стоимость свободных курсоров, в случае, если вы можете уйти со штоком только
  • IDBCursor.continuePrimaryKey(key, primaryKey) - позволяет пропустить пункты с тем же ключом

Я был проинформирован о них с помощью разработчик IDB в команде Chrome, и пока я еще экспериментирую с ними, это кажется идеальным вариантом использования.

Моя мысль заключается в том, что если вы подходите к этой проблеме с двумя разными индексами в одном столбце, вы можете получить такое поведение, которое вы ищете, без раздувания ваших магазинов безвозмездными индексами.

В то время как consecutive writes довольно страшны в ИБР, чтение замечательно. Хорошая производительность в 7700 записей должна быть вполне приемлемой.

+0

'openKeyCursor' и' continuePrimaryKey' awesome! –

+0

continuePrimaryKey это что-то, что можно использовать только в хроме? Другой способ - просто открыть openkeycursor со следующего или предыдущего направления. –

+0

Я еще не полностью обернул вокруг себя голову, но я думаю, что 'continuePrimaryKey' позволяет одновременно использовать два разных индекса: запрашиваемый индекс и «первичный» индекс. – buley

Смежные вопросы