Рейтинг и статистика Thinking sphinx

0

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

У меня есть mysql db со статьями, индекс sphinx настроен для этого db и полнотекстового поиска, все работает. Я хочу получить некоторые цифры:

  1. Сколько раз поиск текста (ключевое слово или ключевая фраза) появляется над всеми статьями на все время (скорее всего, ограничивается "статьями из временного интервала от X и до Y")
  2. То же, что и предыдущее, но за сколько раз 2 ключевых слова или ключевые фразы (так "x И y") появляются в одних и тех же статьях

Я делал что-то похожее на первое ручное использование файла 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 (так почти то, что я искал).

  • 0
    Просто хочу подтвердить: хотите ли вы количество совпадающих записей или количество раз, когда заданные ключевые слова появляются?
  • 0
    Количество раз, когда заданные ключевые слова появляются в одном и том же документе, что будет означать hit_count в терминах сфинкса, поэтому количество совпадающих записей, а не только количество ключевых слов.
Теги:
thinking-sphinx

1 ответ

1
Лучший ответ

Таким образом, чтобы выяснить количество обращений к документу, вы в значительной степени на правильном пути, это просто вопрос получения его в 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"]
  • 0
    Спасибо за идею! На самом деле я вчера придумал что-то, вот что я сделал: в контроллере я поместил @ testing = Article.search params [: search],: без => {: is_active => false},: ranker =>: bm25 (is_active is мой флажок мягкого удаления, я не хочу искать удаленные записи), и я просто отображал номер @ testing.total_entries. Если я правильно понял, то, что он делает, показывает общее количество найденных статей, которые соответствуют моим критериям поиска, так что в значительной степени hit_count! Если только я не прочитал какую-то часть документации, а число, которое я получаю, это что-то еще.
  • 0
    Существует различие между количеством раз, когда термины появляются в каждом результате (hit_count), и количеством записей, у которых есть хотя бы одно совпадение (total_entries).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню