2009-10-21 7 views
6

¿Cómo me aseguro de que lucene me devuelva resultados de búsqueda relevantes cuando mi cadena de entrada contiene términos como C++? Lucene parece ignorar ++ caracteres.Manejo + como personaje especial en la búsqueda de Lucene

Detalles del código: Cuando ejecuto esta línea, obtengo una consulta de búsqueda en blanco.

queryField = multiFieldQueryParser.Parse(inpKeywords); 

keywordsQuery.Add(queryField, BooleanClause.Occur.SHOULD); 

Y aquí es mi analizador personalizado:

public class CustomAnalyzer : Analyzer 
    { 
     private static readonly WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer(); 
    public override TokenStream TokenStream(String fieldName, System.IO.TextReader reader) 
     { 
      TokenStream result = whitespaceAnalyzer.TokenStream(fieldName, reader); 
      result = new StandardTokenizer(reader); 
      result = new LowerCaseFilter(result); 
      result = new StopFilter(result, stop_words); 
      return result; 
     } 
} 

Y estoy ejecutar la consulta de búsqueda de esta manera:

indexSearcher.Search(searchQuery, collector); 

Yo probé QUERYFIELD = multiFieldQueryParser.Parse (QueryParser.Escape (inpKeywords)) ;, pero todavía no funciona. Aquí está la consulta que se ejecuta y devuelve cero visitas. "+ (())"

Gracias.

Respuesta

3

Dado que, + es un carácter especial, que necesita ser escapado. La lista de todos los caracteres que deben escaparse es here (vea la parte inferior de la página).

También debe tener cuidado con el analizador que utiliza durante la indexación. Por ejemplo, StandardAnalyzer omitirá +. Es posible que necesite utilizar algo como WhiteSpaceAnalyzer durante la indexación y la búsqueda, lo que preservará los caracteres especiales en tokenstream. Tenga en cuenta que debe usar el mismo analizador durante la indexación y la búsqueda.

+0

estoy usando WhiteSpaceAnalyzer única ... pero aún se ignoran los caracteres + –

0

Pruebe la codificación UTF-8 de sus consultas de búsqueda.

Puede activar esta como se describe en this article

+0

enlace no funciona .... – Nirmal

1

Además de elegir el analizador adecuado, puede usar QueryParser.Escape(string s) para asegurarse de que todos los caracteres especiales se hayan escapado correctamente.

Como esta es una función estática , puede usarla, incluso si está utilizando MultiFieldQueryParser.

Por ejemplo, puede intentar algo como esto:

queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords)); 
+0

gracias por ur answer.please se refiere a mi pregunta actualizada –

+0

Gracias de nuevo por la respuesta Jesse. Intenté queryField = multiFieldQueryParser.Parse (QueryParser.Escape (inpKeywords)) ;, pero todavía no funciona. Aquí está la consulta que se ejecuta y devuelve cero visitas. "+ (())" –

+0

Oye Ed, ¿funciona para palabras clave simples, sin la función Escape? Si es así, quizás publique más código relacionado con sus objetos Searcher y QueryParser. Recuerde también que debe buscar con el mismo analizador que utiliza para indexar. – Jesse

Cuestiones relacionadas