Я имею активную запись сферы, что я пытаюсь дублировать в sphinx_scope:мышления сфинкса сферы дающей неожиданных результатов ввода диапазона
scope :active, -> (date) { where("DATE(?) BETWEEN active_date AND hide_date-1 ", date) } # between is inclusive
Это достаточно близко для работы правительства, если кто-то может показать мне лучше подход:
sphinx_scope(:search_active) { |today|
{:with => {:active_date => 100.years.ago.to_i..today.to_s.to_time.to_i, :hide_date => today.to_s.to_time.to_i..100.years.from_now.to_i}
}
(да, today.to_s.to_time.to_i немного неудобно ...)
Моя проблема заключается в том, что результаты не кажутся точными. Например, запрос без рамки дает
sphinxQL> SELECT weight(),* FROM `standard_core` WHERE MATCH('1910.15') AND `sphinx_deleted` = 0 LIMIT 0, 10 OPTION field_weights=(section_number=2);
+----------+------+----------------+--------------------+-------------+-----------+------------+------------+-----------------------+-----------------------------------------------------------------------------------+---------------------+
| weight() | id | sphinx_deleted | sphinx_internal_id | active_date | hide_date | created_at | updated_at | sphinx_internal_class | title_sort | section_number_sort |
+----------+------+----------------+--------------------+-------------+-----------+------------+------------+-----------------------+-----------------------------------------------------------------------------------+---------------------+
| 8557 | 3633 | 0 | 908 | 1436936400 | 297642704 | 1451164539 | 1451164539 | Standard | § 1910.15 Shipyard employment. | 1910.15 |
| 6549 | 3637 | 0 | 909 | 1436936400 | 297642704 | 1451164539 | 1451164539 | Standard | § 1910.15(a) Adoption and extension of established safety and health... | 1910.15(a) |
| 6549 | 3641 | 0 | 910 | 1436936400 | 297642704 | 1451164539 | 1451164539 | Standard | § 1910.15(b) Definitions. For purposes of this section: | 1910.15(b) |
Но с областью, наиболее значимые результаты отсутствуют:
sphinxQL> SELECT weight() as weight,* FROM `standard_core` WHERE MATCH('1910.15') AND `active_date` BETWEEN -1672108252 AND 1482127200 AND `hide_date` BETWEEN 1482127200 AND 4639325348 AND `sphinx_deleted` = 0 ORDER BY weight DESC LIMIT 0, 10 OPTION field_weights=(section_number=2);
+--------+------+----------------+--------------------+-------------+------------+------------+------------+-----------------------+-----------------------------------------------------------------------------------+---------------------+
| weight | id | sphinx_deleted | sphinx_internal_id | active_date | hide_date | created_at | updated_at | sphinx_internal_class | title_sort | section_number_sort |
+--------+------+----------------+--------------------+-------------+------------+------------+------------+-----------------------+-----------------------------------------------------------------------------------+---------------------+
| 4566 | 5469 | 0 | 1367 | 1436936400 | 1484632800 | 1451167759 | 1451167759 | Standard | § 1910.27(d)(1)(vi) Ladder wells shall have a clear width of at least 15... | 1910.27(d)(1)(vi) |
| 4549 | 5413 | 0 | 1353 | 1436936400 | 1484632800 | 1451167757 | 1451167757 | Standard | § 1910.27(c)(2) Ladders without cages or wells. A clear width of at least 15... | 1910.27(c)(2) |
| 4549 | 5453 | 0 | 1363 | 1436936400 | 1484632800 | 1451167758 | 1451167758 | Standard | § 1910.27(d)(1)(ii) Cages or wells (except as provided in subparagraph (5) of... | 1910.27(d)(1)(ii) |
Я не думаю, что это на самом деле думает сфинкс ошибка, а скорее что-то с самим сфинксом. Или, скорее, что-то я не понимаю: p
Может ли кто-нибудь пролить свет на то, что здесь происходит?
[изменить] ------------------------------------------- --------------
ОК, с помощью @DGM, я обнаружил, что значения для hide_date неверны в записи базы данных sphinx. Для идентификатора записи 3633 запись 908 базы данных mysql имеет значение даты 2115-07-15.
'2115-07-15'.to_time.to_i
=> 4592610000
Очевидно, что существует немного расхождения между 297642704
и 4592610000
.
Так что я либо неправильно вычисляю диапазон, либо база данных sphinx заполняется ошибкой.
индексы/standard_index.rb
ThinkingSphinx::Index.define :standard, :with => :real_time do
# fields
indexes title, :sortable => true
indexes content
indexes section_number, :sortable => true
# attributes
has active_date, :type => :timestamp
has hide_date, :type => :timestamp
has created_at, :type => :timestamp
has updated_at, :type => :timestamp
end
Является ли это потерять что-то в переводе между полем даты тузда и сфинксом меткой временем?
Хороший обходной путь! Это делает так ** намного проще устранять неполадки. Я использую поле 'date' mysql, но, я думаю, вы правы, это должна быть строка в модели. Я довольно удивлен, потому что стараюсь избегать использования дат в качестве строки для сортировки, потому что это не удается для большинства форматов ... но в этом случае это часть решения. –
Я немного удивлен, что его обрабатывают как строку где-то, если честно - и Rails, и TS/Riddle должны обрабатывать его как экземпляр Date. Тем не менее, означает ли это, что сейчас все работает так, как ожидалось? – pat
Преобразование его в целое число работает как ожидается, и его легче понять. беспроигрышная. Не уверен, что пошло странно, но это хорошо работает :) –