2012-04-05 29 views
18

tengo una consulta comodín que se ve algo como:Solr consulta comodín con espacios en blanco

q=location:los a* 

me gustaría que coincide con "los ángeles" y "Los Altos". Una consulta como:

q=los* 

Funciona muy bien, pero tan pronto como agrego espacio en blanco no consigo resultados. ¿Cómo puedo usar espacios en blanco en mis consultas de comodines?

+0

Tal vez esto no sea posible, la frase prefijo de consultas no están permitidos: [link] (http://lucene.apache.org/core /old_versioned_docs/versions/3_4_0/queryparsersyntax.html#Wildcard%20ASearches) – tbaz

Respuesta

0

Sin ver su configuración, diría que use una KeywordTokenizerFactory ya que probablemente tokenize en espacios en blanco ahora.

+0

Gracias, estoy usando DefaultAnaylzer para indexar, y el texto de mi término es "los angeles" (sin tokenización) en el índice. – tbaz

0

La consulta (suponiendo que tiene tokenizer espacios en blanco): q = Ubicación: Los A * significa que la búsqueda de documentos con la palabra "los" y una palabra que empieza con "a"

Solr (tanto que yo sé) no puede determinar si una palabra (o término) aparece antes que otra.

1

podría sugerir el plugin Solr prefijo de consulta si sólo se está utilizando para comodines en el sufijo como estábamos http://lucene.apache.org/solr/4_0_0/solr-core/org/apache/solr/search/PrefixQParserPlugin.html

ejemplo de uso

http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi 

se correspondería con "Bob Smith" o "Bob Smit "pero no convertir en un cheque de (" Bob "O" Smi * ") como ocurriría si utilizó la primera solución que podría considerar en las líneas de q=name:Bob%20Smi*

Espero que esto sea de alguna ayuda para usted u otra persona buscando como ¡Implementé la solución porque estaba golpeando mi cabeza contra la pared durante horas antes de encontrar esto!

29

Recientemente me he encontrado con este problema, y ​​parece que todo lo que necesita hacer es escapar del espacio en su consulta. Su búsqueda original sería interpretado por Solr como algo parecido a esto:

location:los id:a* 

(asumiendo "id" es su campo de búsqueda por defecto)

Sin embargo, si tuviera que escribir la consulta como:

location:los\ a* 

Entonces sería llegar a ser analizada como:

location:los a* 

Y lo anterior debe producir el resultado s que desee (suponiendo que sus datos estén indexados correctamente).

Consejo: Entender todo esto es simple. Simplemente agregue &debugQuery=on al final de la url que utiliza al enviar su consulta para ver cómo fue analizada por Solr.

+1

He confirmado que esto funciona con un campo de cadena (pero no de texto, consulte http://stackoverflow.com/questions/2630879/solr-extract-word-search para obtener más información). Ojalá hubiera encontrado esto antes ... también, debugQuery = on merece un voto por su cuenta, ¡muy útil! – BLogan

0

creo que se debe utilizar la configuración como esta

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" /> 
    </analyzer> 
    </fieldType> 

y usted tiene que manejar su palabra clave de entrada para la búsqueda como eliminar los espacios en blanco

0

Para mí trabajado

<fieldtype name="text_like" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
    </analyzer> 
</fieldtype> 

y consulta field:*some\ phrase* (en java literal uno tiene que escapar \ como \\).

0

Tuve el mismo problema en mi proyecto. Cuando alguna vez buscaba una palabra junto con el espacio en blanco, no obtenía el resultado. Así que reemplacé el espacio en blanco con un guión "-" mientras indexaba y consultaba. A continuación se snipet schema.xml que utilicé para hacerlo:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([/\s+])" replacement="-" replace="all" 
    /> 
</analyzer> 
<analyzer type="query"> 
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
<filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([/\s+])" replacement="-" replace="all" 
    /> 
</analyzer> 
</fieldType> 
Cuestiones relacionadas