2009-03-09 8 views
7

Quiero que mi consulta de Lucene para contener algo similar a:Let Lucene incluye espacios en término de coincidencia exacta

companyNam: Mercedes camiones

donde hará una coincidencia exacta de la cadena " mercedes trucks "en el campo companyName.
El companyName es un campo untokenized, pero nada con un espacio devuelve resultados nulos ..

new TermQuery(new Term("companyName", "mercedes trucks")); 

Los resultados siempre 0 resultados si hay un espacio en cuestión. De lo contrario, mi programa funciona bien.

+1

Creo que necesitamos ver el código que agrega este campo a los documentos de índice – itsadok

+0

¿CompanyName solo contiene "mercedes trucks"? ¿Has considerado que podría haber un problema en la carcasa? ¿O tal vez algún tipo de StemmingFilter que elimina las terminaciones s? – jishi

+0

@jishi: Ya no estoy trabajando en este proyecto y ya no tengo acceso al código. Creo que podría tratarse de un problema de la carcasa, pero ya no puedo verificarlo. –

Respuesta

0

Supongo que aquí - ¿exactMask agrega comillas alrededor de la cadena? Simplemente debe usar la cadena "mercedes truck", sin manipularla.

new TermQuery(new Term("companyName", "mercedes trucks")); 
+0

De hecho, no está claro, editará la publicación original. Probé la máscara con ambas comillas y no con comillas. Ninguno funcionó. –

0

¿Ha considerado utilizar un PhraseQuery? ¿El campo tiene que ser conjurado? Creo que se desquitó para los identificadores, etc. y no para los campos que tienen varias palabras como contenido.

+0

Agregué una dessecada solo para esto. Porque pensé que necesitaba los espacios. –

4

Puede estar utilizando un analizador diferente durante la búsqueda que aquel con el que creó el índice.

Intente utilizar KeywordAnalyzer durante la búsqueda. Creará un token único de la cadena de búsqueda que probablemente sea lo que está buscando.

+0

Lo comprobaré. Gracias. –

+0

Tuve el mismo problema y el uso de KeywordAnalyzer lo solucionó. –

+0

Estoy usando 'KeyWordAnalyzer' tanto al indexar como al buscar, y todavía interpreto la frase como varios términos cuando realizo la búsqueda. – DCShannon

-1

Incluso estoy enfrentando el mismo problema. Tienes que hacer lo siguiente para deshacerte de este problema. 1) Cuando agregue el valor del campo al documento, elimine los espacios intermedios. 2) Haga el valor del campo en minúsculas. 3) Haga el texto de búsqueda en minúscula. 4) Elimine los espacios en blanco en el texto de búsqueda. Saludos ~ shef

+0

Esto ignorará los espacios, que es lo contrario de incluirlos en la búsqueda. En otras palabras, "One Two" debe coincidir con "One Two", no "OneTwo". – DCShannon

9

Utilice un PhraseQuery así:

//create the query objects 
BooleanQuery query = new BooleanQuery(); 
PhraseQuery q2 = new PhraseQuery(); 
//grab the search terms from the query string 
string[] str = Sitecore.Context.Request.QueryString[BRAND_TERM].Split(' '); 
//build the query 
foreach(string word in str) 
{ 
    //brand is the field I'm searching in 
    q2.Add(new Term("brand", word.ToLower())); 
} 

//finally, add it to the BooleanQuery object 
query.Add(q2, BooleanClause.Occur.MUST); 

//Don't forget to run the query 
Hits hits = searcher.Search(query); 

Espero que esto ayude!

+0

+1 para la división. funcionó muy bien. – mathieu

+0

Esto puede ser peligroso - http://msdn.microsoft.com/en-us/library/ms973837.aspx "String.Split va a crear una matriz de cadenas, lo que significa un nuevo objeto de cadena para cada palabra clave originalmente en su palabras clave cadena más un objeto más para la matriz. Si hacemos esto en el contexto de una ordenación, son muchas las comparaciones y su función de comparación de dos líneas ahora está creando una gran cantidad de objetos temporales. el recolector de basura va a trabajar muy duro en tu nombre, e incluso con el esquema de recolección más inteligente hay mucha basura para limpiar ". – digiguru

8

Quizás reemplazar:

mercedes trucks 

con

mercedes?trucks 

funciona para mí.

+0

¿En el término indexado o la consulta? ¿Cuál es el significado del signo de interrogación? – DCShannon

+1

Más de tres años tarde, pero para el beneficio de cualquiera que lea esto en el futuro: El signo de interrogación es un comodín para un solo carácter en la sintaxis de consulta de Lucene – Zout

0

La mejor forma en que encontré que funciona es analizar la consulta usando el analizador de palabras clave con la siguiente consulta "mercedes? Trucks".

Cuestiones relacionadas