Pregunta

Estoy creando una función de búsqueda para un sitio web de php con Zend Lucene y tengo un problema. Mi sitio web es un Director de Tienda (algo así).

Por ejemplo, tengo una tienda llamada " FooBar " pero mis visitantes buscan "Foo Bar" y obtendrás cero resultados. También si una tienda se llama " Foo Bar " y el visitante busca " FooBar " no se encuentra nada.

Intenté buscar " foobar ~ " (búsqueda difusa) pero no se encontraron artículos con el nombre "Foo Bar" "

¿Hay alguna forma específica de crear el índice o realizar la consulta?

¿Fue útil?

Solución

Opción 1: rompa la cadena de consulta de entrada en dos partes en varios puntos y búsquelos. p.ej. En este caso, la consulta sería (+ fo + bar) O (+ foo + bar) O (+ foob + ar) El problema es que esta tokenización asume que hay dos tokens en la cadena de consulta de entrada. Además, puede obtener resultados adicionales, posiblemente irrelevantes, como los resultados de (+ foob + ar)

Opción 2: use la tokenización de n-gramas al indexar y consultar. Al indexar los tokens para " foo bar " sería fo, oo, ba, ar. Mientras se busca con foobar, los tokens serían fo, oo, ob, ba, ar. La búsqueda con OR como operador le dará los documentos con un máximo de coincidencias de n-gramas en la parte superior. Esto se puede lograr con NGramTokenizer

Otros consejos

Agregue manualmente entradas de índice para las confusiones de nombres más comunes. Haga que sus clientes los escriban en un formulario especial.

¿Has probado " * foo * AND * bar * " o " * foo * OR * bar * " ;? Funciona en Ferret y lo leo está basado en Lucene.

Si no te importa el rendimiento, usa WildcardQuery (el rendimiento es significativamente peor):

new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );

Para cero o más caracteres, use '*', para cero o un carácter, use '?'

Si el rendimiento es importante, intente utilizar BooleanQuery.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top