2012-02-24 9 views
7

Am alguien esperando con suficiente visión sobre el funcionamiento interno de Lucene podría ser capaz de apuntar en la dirección correcta =)TermQuery no volver en un término de búsqueda conocido, pero WildcardQuery hace

voy a omitir la mayor parte del que rodea el código de irellevant, y corte directamente a la persecución. Tengo un índice de Lucene, a la que estoy añadiendo el siguiente campo para el índice (las variables sustituidos por sus valores literales):

document.Add(new Field("Typenummer", "E5CEB501A244410EB1FFC4761F79E7B7", 
         Field.Store.YES , Field.Index.UN_TOKENIZED)); 

Más tarde, cuando busco mi índice (el uso de otros tipos de consultas), soy podido comprobar que este campo aparece de hecho en mi índice - como cuando bucle a través de todos los campos devueltos por Document.GetFields()

Field: Typenummer, Value: E5CEB501A244410EB1FFC4761F79E7B7 

hasta aquí todo bien :-)

Ahora el problema real es - ¿Por qué no puedo usar un TermQuery para buscar en este valor y obtener un resu lt.

Este código produce: 0 hits

// Returns 0 hits 
bq.Add(new TermQuery(new Term("Typenummer", 
     "E5CEB501A244410EB1FFC4761F79E7B7")), BooleanClause.Occur.MUST); 

Pero si me cambio a un WildcardQuery (sin comodines), me sale el 1 hit espero.

// returns the 1 hit I expect 
bq.Add(new WildcardQuery(new Term("Typenummer", 
     "E5CEB501A244410EB1FFC4761F79E7B7")), BooleanClause.Occur.MUST); 

longitudes de campo He comprobado, he comprobado que estoy usando el mismo analizador y así sucesivamente y todavía estoy en la plaza 1 de por qué esto es.

¿Alguien puede indicarme una dirección en la que debería estar mirando?

+2

No estoy muy familiarizado con Lucene.net, pero en caso de que utilice la misma estructura de índice que la versión de Java, puede usar Luke http://code.google.com/p/luke/ para verificar que su índice la estructura cumple con tus expectativasAlternativamente, ¿podría verificar si TermsIndex # seekExact logra encontrar su término? – jpountz

Respuesta

8

Finalmente descubrí lo que estaba pasando. Estoy ampliando las etiquetas para esta pregunta, ya que, para mi sorpresa, en realidad resultó ser un problema con el CMS existe este problema en particular en En resumen, el problema se reducía a esto:.

  1. El campo se almacena UN_TOKENIZED, lo que significa Lucene almacenarlo excactly "tal cual"
  2. el BooleanQuery pegué fragmentos de se envía a la Sitecore SearchManager dentro de un PreparedQuery envoltorio
  3. el comportamiento que se espera de esta era, que mi consulta (ya habiendo sido preparado) iría - inalterado - a la API de Lucene
  4. Resulta que estaba equivocado. Pasa a través de un método RewriteQuery que copia mi conjunto completo de consultas anidadas tal como están, con una excepción: todos los argumentos de términos se pasan a través de una estrategia en minúsculas()
  5. Al indexar un término MAYÚSCULA (UN_TOKENIZED) y Sitecore cambia mi PreparedQuery a minúsculas - 0 resultados se devuelven

no voy a empezar una discusión de si está "por diseño" o "por defecto de diseño" implementación de la API de Lucene Envoltura - que voy a volver a escribir en cuenta que mi consulta al usar la sobrecarga PreparedQuery es ... para mí ... inesperado ;-)

Otras enseñanzas de esto; el almacenamiento del campo como TOKENIZED también eliminará este problema, ya que el StandardAnalyzer por defecto mostrará minúsculas en todos los tokens.

+0

Muy bueno saber –

+0

Acabo de toparme con un problema similar con Lucene.NET. Este post me salvó una pérdida de tiempo gracias. – RationalGeek

+0

@mark Cassidy Wow. Tu el único discutiendo este problema. Tengo un problema similar. Estoy tratando de filtrar el valor antes de pasarlo a la Búsqueda. Filtro de filtro = nuevo QueryWrapperFilter (nuevo WildcardQuery (nuevo Término (campo1, "005NWVOXDYN3U0V6"))) ;. Los valores de texto no están funcionando en ese filtro. Sin embargo, las cifras están funcionando. Incluso intenté TermQuery pero el mismo resultado. ¿Me pueden ayudar con este problema, por favor? – Huzaifa

Cuestiones relacionadas