Я пытаюсь настроить возможность получать некоторые цифры из моих индексов Sphinx, но не знаю, как получить информацию, которую я хочу.
У меня есть mysql db со статьями, индекс sphinx настроен для этого db и полнотекстового поиска, все работает. Я хочу получить некоторые цифры:
Я делал что-то похожее на первое ручное использование файла bat, который я сделал
indexer ind_core -c c:\%SOME_PATH%\development.sphinx.conf --buildstops stats.txt 10000 --buildfreqs
Который породил меня txt со всеми повторяющимися ключевыми словами и как часто они появляются на ранних этапах разработки, что помогло сформировать список ключевых слов, которые меня интересуют. Теперь я пытаюсь сделать то же самое, но только для конечного списка предопределенных ключевые слова и интегрированы в мой проект рельсов, чтобы иметь возможность строить диаграммы в будущем.
Я попробовал запустить несколько запросов
@testing = Article.search 'Keyword1 AND Keyword2', :ranker => :wordcount
но я не уверен, как это работает и как обрабатывать результат, а также, если это то, что я ищу.
Другой подход, который я пробовал, - это ручные запросы mysql, такие как
SELECT id,title,WEIGHT() AS w FROM ind_core WHERE MATCH('@title keyword1 | keyword2') OPTION ranker=expr('sum(hit_count)');
но я не уверен, как обрабатывать результаты здесь (как и как реализовать его в моем существующем проекте rails), и он ограничивается 20 строк на запрос (что, я думаю, я могу изменить где-нибудь в настройках?). Но, по крайней мере, глядя на результаты mysql, меня интересует hit_count по всем статьям (или всем статьям из установленного таймфрейма).
Есть идеи, как это сделать?
UPDATE: Текущий способ, который я нашел, - добавить
@testing = Article.search params[:search], :without => {:is_active => false}, :ranker => :bm25
к контроллеру с некоторыми условиями (так что это не ошибка из поиска nil). : is_active - это мой мягкий флаг удаления, не хотите искать удаленные записи, поэтому не возражайте. И, на мой взгляд, я просто показывал
<%= @testing.total_entries %>
Который, если я его правильно понимаю, показывает мне количество совпадений, найденных sphinx (так почти то, что я искал).
Таким образом, чтобы выяснить количество обращений к документу, вы в значительной степени на правильном пути, это просто вопрос получения его в Ruby/Thinking Sphinx.
Чтобы получить исходные результаты Sphinx (если вам не нужны объекты ActiveRecord):
search = Article.search "foo",
:ranker => "expr('SUM(hit_count)')",
:select => "*, weight()",
:middleware => ThinkingSphinx::Middlewares::RAW_ONLY
... это вернет массив хэшей, и вы можете использовать строковый ключ weight()
для количества попаданий, а строковый ключ sphinx_internal_id
для первичного ключа модели (id
- собственный первичный ключ Sphinx, что не так полезно).
Или, если вы хотите использовать объекты ActiveRecord, Thinking Sphinx имеет возможность обернуть каждый результат поиска в вспомогательный объект, который передает соответствующие методы в базовые экземпляры модели, но позволяет weight
отвечать значениями из Sphinx:
search = Article.search "foo",
:ranker => "expr('SUM(hit_count)')",
:select => "*, weight()"; ""
search.context[:panes] << ThinkingSphinx::Panes::WeightPane
search.each do |article|
puts article.weight
end
Имейте в виду, что перед тем, как поиск будет оценен, панели должны быть добавлены, поэтому, если вы тестируете это на консоли Rails, вы не захотите, чтобы консоль проверила переменную search
(которую я обычно делаю, добавив ; ""
конец начального поиска.
В обоих случаях, как вы отметили, результаты поиска разбиты на страницы - вы можете использовать опцию :page
чтобы определить, какую страницу результатов вы хотите, и :per_page
для определения количества записей, возвращаемых в каждом запросе. Существует стандартный предел в 1000 результатов в целом, но это может быть изменено с использованием параметра max_matches.
Теперь, если вы хотите, чтобы количество ключевых слов отображалось во всех записях Sphinx, лучший способ сделать это, а также воспользоваться возможностями поиска Thinking Sphinx, - это получить исходные результаты совокупного СУММЫ - аналогично первому варианту выше.
search = Article.search "foo",
:ranker => "expr('SUM(hit_count)')",
:select => "SUM(weight()) AS count",
:middleware => ThinkingSphinx::Middlewares::RAW_ONLY
search.first["count"]