Увеличение времени запроса Solr (Sunspot) при поиске без ключевых слов

Учитывая, что я хочу найти 20 релевантных результатов, как мне повысить первые критерии внутри any_of (with(:id).any_of(co_author_ids)) так, чтобы, если есть 20 результатов, соответствующих указанным критериям, он возвращался, а не пытался соответствовать на основе второго критерия?

@solr_search = User.solr_search do
  paginate(:per_page => 20)
  with(:has_email, true)

  any_of do      
    with(:id).any_of(co_author_ids)        
    with(:hospitals_id).any_of(hopital_ids)
  end
end

Первоначально я не думал, что усиление необходимо, так как я полагал, что any_of будет иметь каскадный эффект, но, похоже, это не работает. Я знаю, кто может увеличить время запроса по ключевым словам и полнотекстовому поиску, но не смог заставить его работать с методами with().


person brupm    schedule 02.08.2012    source источник
comment
Вы случайно не нашли решение этой проблемы, потому что это именно то, что я ищу.   -  person Sahil Dhankhar    schedule 30.07.2013
comment
Я не нашел решения с Solr. В итоге я перешел на поиск Elasticsearch и использовал запрос с постоянной оценкой: elasticsearch.org/guide/reference/query-dsl/   -  person brupm    schedule 30.07.2013
comment
да, человек, в этом конкретном случае solr терпит неудачу, но если вы хотите добиться такого типа каскадного эффекта для однозначных индексов solr, то это можно сделать с помощью сортировки, используя функцию в solr params.if набросал ответ с моими ответами, просто в случае, если кто-то еще тратит свое время на достижение этого с помощью solr :)   -  person Sahil Dhankhar    schedule 31.07.2013


Ответы (1)


поскольку co_author_ids является многозначным ключом, у меня достаточно причин полагать, что этого добиться невозможно. хотя с ключами с одним значением можно добиться этого каскадного эффекта, используя сортировку solr с использованием функционального запроса. http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function вместе с Adjust_solr-params http://sunspot.github.io/docs/Sunspot/DSL/Adjustable.html

Пример: предположим, что у вас есть такой запрос:

@solr_search = User.solr_search do
  paginate(:per_page => 20)
  with(:has_email, true)
  any_of do      
    with(:id,author_id) #assuming author id is a solr index        
    with(:hospitals_id).any_of(hopital_ids)
  end
end

и теперь в этом случае вы хотите иметь каскадный эффект и хотите отдать предпочтение точным совпадениям с author_id, вы можете сделать это так

@solr_search = User.solr_search do
  paginate(:per_page => 20)
  with(:has_email, true)
  any_of do      
    with(:id,author_id) #assuming author id is a solr index        
    with(:hospitals_id).any_of(hopital_ids)
  end
  adjust_solr_params do |p|
    p["sort"] = "if(author_id_i = #{id},1,0) desc" #note author_id_i solr eq of author_id
  end  
end

так что это будет сортироваться на основе значения if(author_id_i = #{id},1,0) и, в свою очередь, поместит все записи с auhtor_id так же, как у пользователя сверху.

у меня почему-то возникли проблемы с использованием функции IF, поэтому я вместо этого использовал (практически оба они одинаковы):

@solr_search = User.solr_search do
  paginate(:per_page => 20)
  with(:has_email, true)
  any_of do      
    with(:id,author_id) #assuming author id is a solr index        
    with(:hospitals_id).any_of(hopital_ids)
  end
  adjust_solr_params do |p|
    p[:sort] = "min(abs(sub(author_id_i,#{id})),1) asc" 
  end  
end

я наткнулся на это также http://wiki.apache.org/solr/SpatialSearch при поиске для решения этого, и если вы хотите отсортировать по расстоянию, вы можете сделать что-то вроде:

@solr_search = User.solr_search do
  paginate(:per_page => 20)
  with(:has_email, true)
  any_of do      
    with(:id,author_id) #assuming author id is a solr index        
    with(:hospitals_id).any_of(hopital_ids)
  end
    adjust_solr_params do |p|
      p[:pt] = "#{latitude_of_your_interest},#{longitude_of_your_interest}"
      p[:sfield] = :author_location #your solr index which stores location of the author
      p[:sort] = "geodist() asc"
    end
end

в целом я бы сказал, что вы можете делать много интересных вещей с p["sort"] но в данном конкретном случае это невозможно (imho), потому что это многозначное поле, например: Использование многозначного поля в функции карты Запрос функции Solr, который работает с количеством многозначных полей

Я бы хотел, чтобы они просто предоставили функцию включения для многозначного поля, и мы могли бы просто написать p["sort"] ="if(include(co_authors_ids,#{id}), 1, 0) desc"

но на данный момент это невозможно (опять же имхо).

person Sahil Dhankhar    schedule 31.07.2013