Сравнение механизма полнотекстового поиска - Lucene, Сфинкс, Postgresql, MySQL?

Вам нужно использовать Grouper в вашем DataFrame. Использование mcve в приведенном выше вопросе:

# Month End
df.groupby(pd.Grouper(freq='M')).last()

# Month Start
df.groupby(pd.Grouper(freq='MS')).first()

Примечание. Группировка таким образом группируется по месяцу DateTimeIndex, чьи минимальные и максимальные месячные группы являются календарными и не обязательно входят в индекс.

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

grpr = df.groupby([df.index.year, df.index.month])
data = []
for g, gdf in grpr:
    data.append(gdf.loc[gdf.index.min()])
    data.append(gdf.loc[gdf.index.max()])

new_df = pd.DataFrame(data)
new_df
number             0                   1                   2          
color          green    purple     green    purple     green    purple
1989-01-31  0.246601  0.915123  0.105688  0.645864  0.845655  0.339800
1989-01-31  0.246601  0.915123  0.105688  0.645864  0.845655  0.339800
1989-02-01  0.694509  0.665852  0.593890  0.715831  0.474022  0.011742
1989-02-13  0.770202  0.452575  0.935573  0.554261  0.235477  0.475279
2019-02-25  0.626251  0.826958  0.617132  0.118507  0.079782  0.183616
2019-02-28  0.740565  0.131821  0.968403  0.981093  0.211755  0.806868
2019-03-01  0.812805  0.379727  0.758403  0.345361  0.908825  0.166638
2019-03-08  0.238481  0.045592  0.740523  0.201989  0.432714  0.672510

Правильно видеть дублирование, потому что gdf.index.min() может равняться gdf.index.max(). Проверка устранит дублирование при переборе групп.

307
задан ajreal 16 December 2011 в 09:53
поделиться

4 ответа

Приятно видеть, что кто-то вмешивается в Lucene - потому что я понятия не имею об этом.

Сфинкса, с другой стороны, я знаю достаточно хорошо, так что давайте посмотрим, смогу ли я чем-нибудь помочь.

  • По умолчанию используется ранжирование релевантности результатов. При желании вы можете настроить собственную сортировку и присвоить отдельным полям более высокий вес.
  • Скорость индексирования очень высока, поскольку она напрямую обращается к базе данных. Любая медлительность будет вызвана сложными SQL-запросами, неиндексированными внешними ключами и другими подобными проблемами. Медлительности в поиске тоже не замечал.
  • Я специалист по Rails, поэтому понятия не имею, насколько легко это реализовать с помощью Django. Однако есть Python API, который поставляется с исходным кодом Sphinx.
  • Демон службы поиска (searchd) довольно мало использует память - и вы также можете установить ограничения на , сколько памяти использует процесс индексатора.
  • Масштабируемость - это то, о чем я знаю более отрывочно, но достаточно просто скопировать файлы индекса на несколько машин и запустить несколько демонов searchd. Общее впечатление, которое я получаю от других, заключается в том, что он чертовски хорош при высокой нагрузке, поэтому масштабирование его на несколько машин - это не то, с чем нужно иметь дело.
  • Нет поддержки «вы имели в виду» и т. Д. - хотя это можно легко сделать с помощью других инструментов. Sphinx использует словари, поэтому слова «вождение» и «вождение» (например) будут считаться одним и тем же при поиске.
  • Однако Sphinx не разрешает частичное обновление индекса для данных поля.Обычный подход к этому - поддерживать дельта-индекс со всеми недавними изменениями и повторно индексировать его после каждого изменения (и эти новые результаты появляются в течение секунды или двух). Из-за небольшого объема данных это может занять несколько секунд. Тем не менее, вам все равно придется регулярно переиндексировать основной набор данных (хотя насколько регулярно зависит от волатильности ваших данных - каждый день? Каждый час?). Однако высокая скорость индексирования делает все это довольно безболезненным.

Я понятия не имею, насколько это применимо к вашей ситуации, но Эван Уивер сравнил несколько распространенных вариантов поиска Rails (Sphinx, Ferret (порт Lucene для Ruby) и Solr), выполнение некоторых тестов. Думаю, может быть полезно.

Я не разбирался в полнотекстовом поиске MySQL, но знаю, что он не конкурирует ни по скорости, ни по функциям со Sphinx, Lucene или Solr.

164
ответ дан pat 23 November 2019 в 01:19
поделиться

Я не знаю Sphinx, но что касается Lucene и полнотекстового поиска в базе данных, я думаю, что производительность Lucene не имеет себе равных. Вы должны быть в состоянии почти выполнять любой поиск менее чем за 10 мс, независимо от того, сколько записей вам нужно искать, при условии, что вы правильно настроили свой индекс Lucene.

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

Что касается Требования к ЦП и ОЗУ, выполнение поиска в Lucene не слишком загружает ваш ЦП, хотя индексация данных есть, хотя вы делаете это не слишком часто (возможно, один или два раза в день), так что это не является большим препятствием.

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

82
ответ дан 23 November 2019 в 01:19
поделиться

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

Но у него нет удобных операторов поиска, таких как + или AND (использует & |!), И я не в восторге от того, как они работают на их сайте документации. Хотя в фрагментах результатов условия соответствия выделены жирным шрифтом, алгоритм по умолчанию, для которого условия соответствия не очень хорош. Кроме того, если вы хотите проиндексировать rtf, PDF, MS Office, вам нужно найти и интегрировать конвертер форматов файлов.

OTOH, это намного лучше, чем текстовый поиск MySQL, который даже не индексирует слова из трех букв или меньше. Это значение по умолчанию для поиска MediaWiki, и я действительно так думаю » не годится для конечных пользователей: http://www.searchtools.com/analysis/mediawiki-search/

Во всех случаях, которые я видел, Lucene / Solr и Sphinx действительно хороши . Они представляют собой надежный код и претерпели значительные улучшения в удобстве использования, поэтому все инструменты предназначены для выполнения поиска, удовлетворяющего почти всех.

для SHAILI - SOLR включает библиотеку кода поиска Lucene и имеет компоненты, которые должны быть хорошей подставкой. - одна поисковая система.

28
ответ дан 23 November 2019 в 01:19
поделиться

SearchTools-Avi сказал: «Текстовый поиск MySQL, который даже не индексирует слова из трех букв или меньше. "

К сведению, минимальная длина слова MySQL для полнотекстового поиска регулируется, начиная с по крайней мере MySQL 5.0. Google 'mysql fulltext min length' для простых инструкций.

Тем не менее, у MySQL fulltext есть ограничения: во-первых, он медленно обновляется, когда вы достигаете миллиона записей или около того ...

10
ответ дан 23 November 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: