2009-03-03 6 views
5
string q = "m"; 
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*"); 

dará lugar a la consulta de ser un prefixQuery: Compañía: A *¿Por qué esta consulta de Lucene es "contiene" en lugar de "startsWith"?

Aún así voy a obtener resultados como "Flota de África", donde es bastante obvio que el A no está al principio y por lo tanto me da resultados no deseados .

Query query = new TermQuery(new Term("company", q+"*")); 

dará lugar a la consulta de ser un termQuery: Compañía: A * y no devolver ningún resultado. Probablemente porque interpreta la consulta como una coincidencia exacta y ninguno de mis valores es el literal "a *".

Query query = new WildcardQuery(new Term("company", q+"*")); 

devolverá los mismos resultados que el prefixquery;

¿Qué estoy haciendo mal?

Respuesta

0

La respuesta corta: todas sus consultas no restringen la búsqueda al comienzo del campo. Necesita un EdgeNGramTokenFilter o algo así. Ver this question para una implementación de autocompletar en Lucene.

+0

Sin duda, el ejemplo es demasiado farfeched, ¿verdad? ¿No es posible crear una pregunta startwith like sin todo el fuzz? –

+0

No es que yo sepa. Startwith es complicado. Si logra hacer esto, hágamelo saber. Por lo que veo, PrefixQuery significa buscar el comienzo de cualquier término, no solo el primero. –

+0

Esto realmente me sorprende. Startswith debe ser la consulta más fácil de hacer, ¿no? –

4

StandardAnalyzer se tokenize "Flota de África" ​​en "flota" y "África". Su búsqueda a * coincidirá con el término posterior.

Si usted quiere considerar "Flota de África" ​​como uno solo término, utilice un analizador que no se rompe la cadena de espacios en blanco. KeywordAnalyzer es un ejemplo, pero es posible que desee minúsculas de sus datos para que las consultas no distingan entre mayúsculas y minúsculas.

Cuestiones relacionadas