2009-12-30 21 views
11

Me gustaría implementar la búsqueda de texto completo en mi aplicación fuera de línea (Android) para buscar en la lista de notas generadas por el usuario.Búsqueda de texto completo como Google

me gustaría que se comporte igual que Google (ya que la mayoría de la gente ya se utilizan para realizar consultas a Google)

Mis requisitos iniciales son:

  • rápido: como Google o tan rápido como sea posible, tener 100000 documentos con 200 palabras cada uno.
  • buscando a dos palabras sólo debe devolver los documentos que contengan ambas palabras (no sólo una palabra) (a menos que se utiliza el operador OR)
  • Caso insensible (aka: normalización): Si tengo la palabra 'Hola' y yo buscar 'hola' debe coincidir.
  • Insensible a las marcas diacríticas: si tengo la palabra 'así', la búsqueda de 'asi' debe coincidir. En español, muchas personas, de forma incorrecta, no ponen marcas diacríticas o no las ponen correctamente.
  • Eliminación de eliminación de palabras: para no tener un índice enorme, las palabras sin sentido como 'y', 'el' o 'para' no deberían indexarse ​​en absoluto.
  • Sustitución del diccionario (también conocido como palabras madre): las palabras similares deben estar indexadas como una sola. Por ejemplo, los casos de "hambriento" y "hambriento" deberían reemplazarse por "hambre".
  • Búsqueda de frase: si tengo el texto '¡Hola, mundo!' una búsqueda de '' hello mundial '' no debería coincidir, pero una búsqueda de '' hello world '' debe coincidir.
  • Buscar todos los campos (en documentos multifield) si no se especifica ningún campo (no solo un campo predeterminado)
  • Autocompletar en los resultados de búsqueda mientras se escribe para realizar búsquedas populares. (al igual que Google Suggest)

¿Cómo puedo configurar un motor de búsqueda de texto para que se comporte tanto como sea posible con Google?

(soy su mayoría interesados ​​en el Open Source, Java y, en particular, Lucene)

+1

Si apunta a Lucene, que maneja muchos de estos productos de fábrica y es extensible, ¿puede especificar qué problema está teniendo? –

+0

¿Qué estás buscando? – SLaks

+0

Te das cuenta de que Google emplea http://en.wikipedia.org/wiki/Query_expansion y utiliza el historial de búsqueda de otras personas. Si todos los que buscan "ratones de la computadora" terminan haciendo clic en yahoo.com (inventando), con el tiempo yahoo.com se convertirá en el primer resultado de búsqueda para "ratones de la computadora". –

Respuesta

14

Creo que Lucene puede satisfacer sus necesidades. También debería considerar usar Solr, que tiene una funcionalidad similar y es mucho más fácil de configurar.

Discutiré cada requisito por separado, usando Lucene. Creo que Solr tiene mecanismos similares.

  • rápido: como Google o tan rápido como sea posible, teniendo 100000 documentos con 200 cien palabras cada uno.

Este es un tamaño de índice razonable tanto para Lucene y Solr, lo que permite la recuperación a varias decenas de milisegundos por consulta.

  • buscando a dos palabras sólo debe devolver los documentos que contengan ambas palabras (no sólo una palabra) (a menos que se utiliza el operador OR)

Usted puede hacer que el uso de un BooleanQuery con MUST por defecto en Lucene.

Los siguientes cuatro requisitos pueden ser manejados por la personalización de una Lucene Analyzer:

  • Caso insensible (aka: normalización): Si tengo la palabra 'Hola' y buscar 'hola' lo que debería partido.

A LowerCaseFilter se puede utilizar para esto.

  • marca diacrítica insensible: Si tengo la palabra 'Así' una búsqueda de 'ASI' deberán corresponder. En español, muchas personas, de forma incorrecta, no ponen marcas diacríticas o no las ponen correctamente.

Esto requiere normalización Unicode seguido de la eliminación diacrítica. Puede construir un Analizador personalizado para esto.

  • palabra STOP eliminación: Para no tener un enorme índice de palabras sin sentido como 'y', 'el' o 'para' no debe ser indexado en absoluto.

Un StopFilter elimina dejar de palabras en Lucene.

  • Diccionario de sustitución (también conocido como: palabras tallo): Palabras similares debe ser indexado como uno. Por ejemplo, los casos de "hambriento" y "hambriento" deberían reemplazarse por "hambre".

Lucene tiene muchos Snowball Stemmers. Uno de ellos puede ser apropiado. Búsqueda

  • Frase: Si tengo el texto '¡Hola mundo!'una búsqueda de' 'hola del mundo' 'no debería coincidir, pero una búsqueda de' 'hola mundo' 'debería coincidir.

Esto está cubierto por la consulta especializada Lucene PhraseQuery.

Como puede ver, Lucene cubre todas las funciones requeridas. Para obtener una imagen más general, sugiero el libro Lucene in Action, The Apache Lucene Wiki o The Lucid Imagination Site.

2

Comprar un Google Search Appliance. O, como dicen los comentarios, use Lucene como ya ha mencionado.

+1

Un dispositivo de búsqueda de Google no es una buena respuesta para buscar datos en una aplicación de Android sin conexión. –

+2

El bit de Android se agregó 7 horas después de haber publicado mi respuesta. 3 años después, el panorama de búsqueda ha cambiado drásticamente. –

3

Muchos de estos comportamientos son predeterminados para Lucene. La primera (incluyendo todos los términos) no es, pero puede forzar este comportamiento estableciendo el operador por defecto:

MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer()); 
parser.setDefaultOperator(QueryParser.AND_OPERATOR); 

sé que los artículos 2, 4, y 6 son posibles, y IIRC, que se produzcan de forma predeterminada. No estoy seguro de los elementos 3 y 5, pero Lucene ofrece muchas opciones de personalización, por lo que le sugiero que implemente una prueba de concepto con sus datos para ver si cumple con estos requisitos también.

0

A menos que compre un motor de búsqueda, tiene Lucene, Nutch, Apache Solr y algunos otros.

0

HyperSQL es una implementación SQL pura-java que se puede ejecutar con bastante facilidad, al igual que SQLite. Puede usar sus capacidades de texto completo y consultar para volver a crear la rueda, pero como otros comentaristas han señalado, una implementación existente es probablemente la mejor.

Cuestiones relacionadas