Как связать поисковые индексы с моделями в MVC?

У меня есть приложение MVC, которое мне нужно для поиска. Приложение является модульным, поэтому модулям должно быть легко регистрировать данные для индексации с помощью модуля поиска.

В настоящее время существует только быстрое временное решение, которое хорошо для гибкости, но скорость всегда была проблемой. Модули регистрируют модели (а также отношения и столбцы), по которым они хотели бы иметь возможность поиска. При поиске функция поиска запрашивает данные, используя эти отношения, и применяет Левенштейна, удаляет стоп-слова, выполняет замену символов и т. Д. Ясно, что это замедлится по мере увеличения объема данных, поэтому их нецелесообразно сохранять, поскольку они эффективно select * from x,y,z, а затем просматривают данные.

Преимущество вышесказанного заключается в том, что существует прямая связь с моделью, которая нашла данные. Например, если Model_Product что-то находит, я знаю, что в моем коде я могу использовать Model_Product::url(), чтобы связать результат с соответствующим местоположением, или Model_Product::find(other data), чтобы показать, скажем, изображение или описание, если ключевое слово было найдено, например, в заголовке.

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

Я читал о различных вариантах, и все они кажутся очень похожими, поэтому маловероятно, что люди смогут предложить «правильный» вариант, не провоцируя дискуссию или дебаты, но для протокола; из следующих вариантов, я склоняюсь к Solr. Я не высечен в камне, поэтому, если у кого-то есть какие-то советы, которыми они хотели бы поделиться, или другие варианты, на которые я мог бы взглянуть, это было бы здорово.

Просматривая различные учебные пособия и руководства, все они кажутся относительно простыми в установке и настройке. В приведенном выше случае я могу заставить модули регистрировать путь к файлам конфигурации / моделям индекса поиска и заставить поисковик запускать их все через программу поиска x. Это создаст мои индексы и предоставит средства для запроса данных. Отлично.

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

Также может ли кто-нибудь подтвердить, нужен ли мне экземпляр любого из вышеперечисленных для каждого виртуального хоста? Это то, о чем я не могу найти много информации. Я бы предположил, что могу просто подключиться к одному экземпляру и сказать ему, какие данные актуальны? Это очень похоже на подключение к одному серверу СУБД с учетными данными x для базы данных y.

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

Изменить: Этот вопрос, кажется, склонил меня больше к Solr. Здесь также есть аналогичная ветка здесь с изрядное понимание Сфинкса.


person Ben Swinburne    schedule 20.05.2013    source источник


Ответы (1)


ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я могу говорить только о Lucene / Solr и, я полагаю, ElasticSearch, поскольку я знаю, что он основан на Lucene. Другие могут работать, а могут и не работать таким же образом.

Если я индексирую данные, выполняю поиск и, в свою очередь, нахожу результат, скажем, с помощью Solr, как мне узнать, как получить всю другую информацию, относящуюся к найденному биту?

Вы можете хранить любые дополнительные данные, которые хотите, например ключ базы данных, указывающий на конкретную строку в базе данных. Lucene / Solr также может помочь вам найти относительную информацию, например если у вас есть пункт проката DVD, и пользователь неправильно написал название фильма, Lucene выяснит это за вас и (в отличие от DB) все равно перечислит ближайшие альтернативы. Вы также можете предоставлять подсказки, увеличивая определенные поля во время индексирования или запроса. Существуют специальные расширения для геопространственного поиска и т. Д. И, очевидно, вы можете предоставить свой владеть, если нужно.

Также может ли кто-нибудь подтвердить, нужен ли мне экземпляр любого из вышеперечисленных для каждого виртуального хоста?

Lucene - это библиотека низкого уровня, которая должна присутствовать в каждой JVM, которую вы запускаете. Solr (построенный на основе Lucene) - это HTTP-сервер. Вы можете звонить на него от любого количества клиентов. Дополнительные параметры масштабирования описаны здесь.

person mindas    schedule 20.05.2013
comment
для добавления: ElasticSearch, как и Solr, также является http-сервером. - person Geert-Jan; 20.05.2013
comment
Как я могу указать, скажем, конкретное название модели или информацию, не найденную в наборе данных, а о наборе данных с проиндексированной информацией. Например, если я проиндексирую свою products таблицу, я бы хотел, чтобы индекс мог ссылаться на Model_Product, чтобы я знал идентификатор строки и, следовательно, мог использовать Model_Product для получения информации, которая имеет отношение к моим результатам, но не обязательно найдена в этом конкретном строка, т.е. связанная таблица. Мне пока не удалось найти информацию о том, как это сделать. - person Ben Swinburne; 23.05.2013
comment
Вам нужно денормализовать структуру данных в плоский документ. Другими словами, вам нужно сохранить либо внешний ключ для другого объекта, чтобы его можно было извлечь, либо индексировать соответствующие поля объекта, либо и то, и другое. - person mindas; 23.05.2013
comment
Я могу легко сохранить внешний ключ и т. Д., Это нормально, потому что он находится в наборе данных. На самом деле мне нужно иметь возможность хранить дополнительную информацию, которую нельзя найти с помощью запроса, но которая автоматически связана с этими данными. Например, я мог бы сделать select * from products для создания коллекции продуктов, но при извлечении этих данных мне нужно знать, например, из какой таблицы были взяты данные. Есть ли способ сказать select * from products + some static data not in the database? - person Ben Swinburne; 23.05.2013
comment
Это определенно возможно и зависит от того, как вы реализуете свою интеграцию с Solr. Запрос на индексирование документа может содержать столько дополнительной информации, сколько необходимо, поэтому вы можете добавить свое поле product_source. Solr на самом деле не волнует, откуда взялись эти данные - пусть это будет база данных, или ваш код, или что-то еще. - person mindas; 23.05.2013
comment
Я изо всех сил пытаюсь найти, где это задокументировано, я могу найти только сопоставление полей с данными из запроса, а не с данными из внешнего источника. Где это задокументировано, чтобы я знал, как это сделать? Я уверен, что концептуально это возможно, но я не могу найти, как это сделать. Ваше здоровье - person Ben Swinburne; 23.05.2013
comment
В руководстве по Solr рассматривается следующее: lucene.apache.org/solr/4_3_0/tutorial.html (см. главу об индексировании данных). Вы также можете ознакомиться с wiki.apache.org/solr/DataImportHandler - person mindas; 23.05.2013