Атрибут на мислещия сфинкс от полето за дата и час на полиморфната асоциация

Имам модел A, свързан с модел B чрез INNER JOIN:

class A  
  has_many :bees, as: :bable
  scope :bees, -> () {
    joins("INNER JOIN bees AS b ON id = b.bable_id .......")
  }
end

class B
  table_name = "bees"
  belongs_to :bable, polymorphic: true
end

Трябва да филтрирам с помощта на полето за дата и час на B (created_at), така че декларирах нов атрибут по следния начин:

has bees.created_at, as: :b_created_at

Изявлението за заявка за сфинкс, генерирано сега, включва:

GROUP_CONCAT(DISTINCT UNIX_TIMESTAMP(bees.`created_at`) SEPARATOR ',') AS `b_created_at`

След индексирането размерът на моя файл с индекс на сфинкс се увеличи.

  1. Колко е частта "GROUP_CONCAT" от заявката, която причинява проблема, и има ли по-добър начин за филтриране по този атрибут?
  2. Как мога да отстраня грешки в индексатора и да намеря други причини за генерирането на големия индекс файл?

Благодаря


person Jonathan    schedule 16.04.2015    source източник


Отговори (1)


Изглежда, че индексаторът създава в рамките на индексния файл списък, разделен със запетая, на всички създадени времеви клейма на всички bees - тъй като създадените времеви клейма обикновено са уникални (!), това индексиране ще създаде един елемент за всеки bee. Ако имате много bees, тогава това ще бъде голямо.

Бих търсил някакъв начин за заобикаляне на Sphinx за тази част от заявката, ако това е възможно и вместо това да го накарам да добави директен SQL BETWEEN LowDateTs AND HighDateTs срещу вградения created_at. Надявам се, че това е възможно - определено ще бъде по-добре, отколкото да използвате текстов индекс, за да го намерите.

Надявам се това да е от някаква помощ.

Редактиране:

Бързо четене на документи на Sphinx:

[...] WHERE клауза. Тази клауза ще съпостави както заявка с пълен текст, така и филтри. Всички оператори за сравнение (=, !=, ‹, >, ‹=, >=), IN, AND, NOT и BETWEEN се поддържат и се преобразуват директно във филтри [...]

Така че ключът е да спрете да третира клеймото за време като търсене на текст и да използвате BETWEEN, което ще бъде много по-ефективно и се надяваме да спре да се опитва да използва индексиране на текст в това поле.

person PaulG    schedule 19.04.2015
comment
Sphinx третира времевите клейма като цели числа и търси с помощта на BETWEEN. Клаузата WHERE би помогнала, ако искам да огранича записите, които да бъдат индексирани, но не и ако имам нужда от всички записи. - person Jonathan; 19.04.2015
comment
Ако не искате да филтрирате клеймото за време, проблемът, който се опитвате да решите, е че искате да добавите полето за клеймо за време, но искате да кажете на Sphinx да не го индексира? - person PaulG; 19.04.2015
comment
Искам да филтрирам клеймото за време. Sphinx позволява да се правят 2 неща: търсене в текстови полета и филтриране по атрибути. Правя второто. Въпросът ми е дали този атрибут причинява или не увеличаване на размера на индексния файл. - person Jonathan; 19.04.2015
comment
Добре. Мое недоразумение. Кратък отговор – да. За n пчели индексът вероятно ще включва n цели числа +n-1 запетаи, така че индексът в това поле ще се мащабира линейно (около двойно) с броя на пчелите. - person PaulG; 19.04.2015
comment
Ако е възможно във вашето приложение, бих искал да изключа клеймото за време от индексатора и където и да заявя данните за пчелите, бих филтрирал там по клауза where, след което предам този набор от данни, за да позволя на Sphinx да използва спрямо другите критерии за търсене (или обратното). Това може да не е възможно или това, което искате! - person PaulG; 19.04.2015