c# - Cómo realizar una búsqueda ''contiene'' en lugar de ''comienza con'' usando Lucene.Net
search (2)
Usamos Lucene.NET para implementar una búsqueda de texto completo en el sitio web de un cliente. La búsqueda en sí ya funciona, pero ahora queremos implementar una modificación.
Actualmente todos los términos se anexan a *
que lleva a Lucene a realizar lo que yo clasificaría como una búsqueda de StartsWith
.
En el futuro nos gustaría tener una búsqueda que realice algo como un Contains
lugar de un StartsWith
.
Usamos
- Lucene.Net 2.9.2.2
- StandardAnalyzer
- QueryParser predeterminado
Muestras:
(Title:Orch*)
coincide con: Orchestra
pero:
(Title:rch*)
no coincide: Orchestra
Queremos que el primero y el segundo coincidan con Orchestra
.
Básicamente quiero exactamente lo contrario de lo que se preguntó en esta pregunta, no estoy seguro de por qué para esta persona Lucene realizó un Contains
y no un StartsWith
por defecto:
¿Por qué esta consulta de Lucene es "contiene" en lugar de "startsWith"?
¿Cómo podemos hacer que esto ocurra?
Tengo la sensación de que tiene algo que ver con el Analizador, pero no estoy seguro.
@Simon Svensson probablemente dio la mejor respuesta (es decir, no es necesario), pero si lo hace, debe usar un filtro Shingle .
Tenga en cuenta que esto hará su índice enormemente más grande, ya que en lugar de simplemente almacenar "orquesta", almacenará "orc", "rch", "che", "hes" ... Pero solo tiene una consulta simple con comodines líderes será masivamente lento Básicamente, tendrá que examinar todos los términos de su corpus.
En primer lugar, supongo que estás usando StandardAnalyzer, o algo similar. Su pregunta vinculada no comprende que usted busca términos, y su caso a*
coincidirá con "Fleet Africa" porque está tokenizado en "fleet" y "africa".
Necesita llamar a QueryParser.SetAllowLeadingWildcard(true)
para poder escribir consultas como field:*value*
. ¿Estás cambiando la cadena que pasó a QueryParser?
Puede analizar la consulta como de costumbre y luego implementar un QueryVisitor que reescribe todos los TermQuery
en WildcardQuery
. De esa forma, aún admite búsquedas de frases.
No veo nada bueno al reescribir las consultas en consultas de prefijo o comodín. Hay muy poco compartido entre un orco, un cofre y una orquesta, pero ambas palabras coincidirán. En su lugar, conecte a su cliente con un analizador que admita stemming, sinónimos, y proporcione una función de corrección ortográfica para corregir errores de búsqueda simples.