2017-01-05 4 views
0

범위의 입력에서 예상치 못한 결과가 산출 스핑크스 범위 생각 :내가이 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 데이터베이스 레코드에서 올바르지 않다는 것을 발견했습니다. 레코드 ID 3633의 경우, mysql 데이터베이스 레코드 908의 날짜 값은 2115-07-15입니다.

'2115-07-15'.to_time.to_i 
=> 4592610000 

분명 2976427044592610000 간의 불일치의 비트가있다.

그래서 범위를 잘못 이해하고 있거나 스핑크스 데이터베이스에 오류가 있습니다.

인덱스/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 

하는 MySQL의 날짜 필드와 스핑크스 타임 스탬프 사이의 번역이 잃고 무엇인가?

답변

1

나는 문제가 여기에 무엇인지 전혀 모르겠지만, 몇 가지 생각 :

당신이 그를 저장하는 경우 날짜를 문자열 값으로 사용하면 스핑크스로 전달됩니다. :type 설정은 속성 값을 변환하는 것이 아니라 Sphinx 구성 파일을 생성하는 데만 사용됩니다 (물론 확실한 것은 두 가지 모두해야한다는 강력한 주장입니다!). 물론, 그것은 2115-07-15가 297642704가되는 방법을 잘 설명하지는 않지만, 놀고있는 것의 일부일 수 있습니다. 다시 말하지만, 모델이 Date가 아닌 String으로 hide_date을 반환하는 경우에만 마찬가지입니다.

Sphinx는 타임 스탬프를 부호없는 정수로 저장하므로 1970 년 1 월 1 일 이전의 항목은 피해야합니다.

문제에 대한 해결책은 아니지만 가장 중요한 문제에 대한 해결책입니다. 스핑크스에서 날짜 자체의 정수 표현을 사용하는 것이 좋습니다. 예 : 2115-07-15는 21150715가됩니다.

그래서, 모델에 다음과 같은 :

def hide_date_to_i 
    hide_date.to_s.gsub('-', '').to_i 
end 

그리고 인덱스 정의 : 당신은 그에 따라뿐만 아니라 당신의 범위를 업데이트해야합니다

has hide_date_to_i, :as => :hide_date, :type => :integer 

.

잘하면 그 일들이 적절하게 작동 할 것이지만 그렇지 않다면 적어도 스핑크스 값을 디버그하기 쉬워야합니다!

+0

좋은 해결 방법! 따라서 ** 문제 해결이 훨씬 쉬워졌습니다. mysql'date' 필드를 사용하고 있습니다 만, 모델에있는 문자열이어야합니다. 나는 대부분의 형식에서 실패하기 때문에 정렬을위한 문자열로 날짜를 사용하지 않으려 고하기 때문에 오히려 즐겁다. 그러나이 경우에는 솔루션의 일부이다. –

+0

Rails와 TS/Riddle 둘 다 Date 인스턴스로 처리해야한다는 점에 조금 놀랍습니다. 그럼에도 불구하고 이것은 의미있는 일이 예상대로 진행되고 있습니까? – pat

+0

정수로 변환하면 예상대로 작동하고 이해하기 쉽습니다. 윈 - 윈. 무슨 hinky 갔는지 잘 모르지만,이 잘 작동합니다 :) –

0

귀하의 hide_date 데이터가 다른 시간에 비해 너무 낮은 것으로 보인다 범위 : 297642704

+0

실제로 올바른 것입니다. 안구를 가져 주셔서 감사합니다. Hoping Pat은 이것을보고 주소를 잘못 인식하고 있는지 또는 스핑크스 데이터베이스가 잘못 채워져 있는지 여부를 확인합니다. –