2011-12-02 16 views
5

me gustaría reproducir la siguiente consulta Solr crudo con las manchas solaresMancha solar: ¿cómo hacer una consulta de texto completo en múltiples campos con diferentes valores?

q=exact_term_text:foo OR term_textv:foo* OR alternate_text:bar* 

pero no soy capaz de entender si y cómo esto es posible, a través de la interfaz estándar de manchas solares, ya que parece que:

  1. fulltext el método no parece aceptar varios argumentos de texto search_fields/
  2. no sabría qué argumento a pasar como el primero en fulltext, como si paso o bien "foo" o "bar" la re los resultados no coincidirían
  3. Si paso un argumento vacío, obtengo un q=*:*
  4. filtros de ámbito (p. with(:term).starting_with('foo*') son (como su nombre lo indica) aplicadas como consultas de filtro, y por lo tanto no toman parte en la puntuación.

Parece posible componer a mano la cuerda (o posiblemente usar adjust_solr_params), pero eso parece hackish. ¿Hay una mejor solución?

Respuesta

8

En Sunspot 2.0.0, hay un comportamiento no documentado y no compatible que funciona. El propio autor sugiere que no debería y probablemente no lo hará en versiones futuras.

Puede pasar múltiples texto completo pone en la definición de búsqueda

Post.search do 
    fulltext "foo", {:fields => :exact_term} 
    fulltext "bar", {:fields => :alternate} 
end 

Esto se traduce en una consulta Solr del (de los troncos)

INFO: [] webapp=/solr path=/select 
params={fl=*+score&start=0&q=_query_:"{!dismax+qf%3D'exact_term'}foo"+_query_:"{!dismax+qf%3D'alternate'}bar"&wt=ruby&fq=type:Post&rows=30} 
hits=1 status=0 QTime=7 

subcadenas coincidentes está cubierto de https://github.com/sunspot/sunspot/wiki/Matching-substrings-in-fulltext-search

Se puede cambiar el operador predeterminado (AND/OR) agregando una opción minimum_match 1 como se menciona en http://blog.tonycode.com/archives/192

+0

usando (borde) N-gramas no es exactamente la misma cosa porque no me dejaron diferenciar entre consultas mediante programación, donde una coincidencia parcial es aceptable y no sin indexación el mismo campo dos veces. Parece que el uso de susnpot del controlador de consultas dismax no me permite hacer consultas de lucene sin soluciones de hack, así que estoy aceptando la respuesta de todos modos, gracias. – riffraff

+3

En la documentación sobre manchas solares en https://github.com/sunspot/sunspot/wiki/Fulltext-search, se establece explícitamente: "Tenga en cuenta que el método' keywords' no se debe invocar varias veces en una búsqueda; las llamadas sucesivas sobrescribirán el palabras clave previamente especificadas ". * ('keywords' tiene el alias de' fulltext', son el mismo método). * De acuerdo con los autores, su solución no funcionará ... sin embargo, parece funcionar perfectamente. Hmmm, alguien está mintiendo. – Jazz

+0

Quizás el texto completo no se deba invocar en el mismo campo dos veces. – juanpastas

2

Si el documentation es correcto, no puede llamar al fulltext dos veces. Así que terminé ejecutando dos búsquedas y calculando la intersección de ambas búsquedas.

a = Post.search do 
    fulltext "foo", {:fields => :exact_term} 
end 

b = Post.search do 
    fulltext "bar", {:fields => : alternate} 
end 

result = a & b 

La forma de calcular la intersección dependerá de lo que intente exactamente lograr. La intersección de arriba es un poco ingenua. Por ejemplo, puede querer normalizar el puntaje de cada resultado con respecto al máximo, y usar el promedio del puntaje normalizado para fines de clasificación.

1

También necesito tener varias búsquedas de texto completo para diferentes campos, con diferentes valores. Además, necesito que se cumplan todas las condiciones. En otras palabras, necesito que tanto 'foo' como 'bar' estén en Post para exact_term y campos alternativos.

Post.search do 
    fulltext "foo", {:fields => :exact_term} 
    fulltext "bar", {:fields => :alternate} 
end 

El problema fue que no pude cambiar mi configuración schema.xml (defaultOperator). Fue establecido en 'O'.Si usted tiene problema similar se puede solucionar de esa manera:

Post.search do 
    adjust_solr_params do |params| 
     params[:q] = params[:q].gsub(/\s_query/, " AND _query") if params[:q].present? 
    end 
end 
Cuestiones relacionadas