2015-05-17 3 views
0

Поиск иногда не дает результатов, когда индексы sphinx разделяются на несколько файлов в одной модели.Поиск мышления sphinx ничего не возвращает, когда несколько индексных файлов, используемых в одной модели

Версии я использую:

  • Rails - 4,1
  • Thinking Sphinx - 3.0.6
  • Sphinx - 2.0.9

У меня есть пять индексов на этой модели :

ThinkingSphinx::Index.define :incident, name: "incident_index_1" ... do 
    indexes name 
end 

ThinkingSphinx::Index.define :incident, name: "incident_index_5" ... do 
    indexes tags.name, as: :tag  
    indexes custom_fields_values.value, as: :custom 
end 

Поиск отдельно, t он запрашивает возвращать правильные результаты:

Incident.search(conditions: { custom: "dd" }) 
Incident.search("some string") 

Однако объединение запросов поля конкретного с общим запросом иногда не возвращает ничего:

Incident.search("some string", conditions: { custom: "dd" }) 

Если «некоторая строка» находится в tag поле (которое определяется в том же файле индекса), он работает. Если он находится в поле name (который определен в другом файле индекса), он не работает.

+0

Я предполагаю, что это не все ваше определение индекса, проходящее через предоставленный контекст - можете ли вы поделиться всем в определении индекса? – pat

+0

Я добавил дополнительную информацию. Все определение довольно длинное, и я не уверен, насколько он уместен. В общем, у меня есть еще 25 атрибутов «есть», все они определены в каждом индексе и еще 15 «индексов» полей, распределенных между 5 определениями индексов. – Jonathan

+0

Хорошо, поэтому я предполагаю, что я хочу знать: вы ожидаете, что «какая-нибудь строка» будет в любом поле для конкретной записи, а «dd» - в настраиваемом поле для этой же записи? Я не думаю, что это связано с полиморфизмом, потому что вы проходите стандартную ассоциацию (это инверсная, которая является полиморфной). – pat

ответ

1

As clarified via discussions on the Sphinx forums, проблема здесь в том, что поля находятся в различных индексах, а также документ Sphinx (запись в индексе, который в Thinking Sphinx/Rails контексте является экземпляром модели ActiveRecord) должен существовать только в один Индекс Sphinx, а не по нескольким.

Редактировать

Чтобы завершить ответ здесь в SO и сделать вопрос автономно, индекс теперь выглядит следующим образом:

(1..5).each do |ind| 
    ThinkingSphinx::Index.define :incident, name: "incident_index_#{ind}" ... do 
    where "incidents.id % 5 = #{ind - 1}" 
    indexes ... 
    has ... 
end 

Документы, таким образом, в равной степени распределены между пятью сфинкса индексных файлов, без документ, существующий в нескольких файлах индекса.