tutorial pro plus full ejemplos business avast solr elasticsearch lucene sphinx

pro - solr tutorial



Alternativas para buscar software/servidores para recuperar identificadores para todos los documentos coincidentes (2)

Estoy tratando de descubrir cómo filtrar un gran conjunto de documentos basados ​​en la coincidencia de palabras clave.

Tengo más de 20 millones de entradas con ID y (varios) campos de texto en mi base de datos SQL y quiero obtener todos los ID para los que el texto coincide con un conjunto de palabras clave. Esto incluye expresiones más complejas como:

(term1 NEAR term2 NEAR term3) AND NOT "A phrase" AND @fieldXYZ "wildcards%aswell*"

Los resultados no necesitan calificarse, clasificarse ni clasificarse de ninguna manera.

Por lo que entiendo, el poder de Lucene / Solr, Sphinx y ElasticSearch es devolver los documentos TOP muy rápido, pero en realidad no están destinados a devolver TODOS los documentos.

Sé que es posible hacer esto con un recopilador personalizado en Lucene (consulte ¿Cuál es la forma más eficiente de recuperar todos los documentos coincidentes de una consulta en Lucene, sin clasificar? ) Y posiblemente con Cursores / Desplazamiento en Solr / Elasticsearch, pero me pregunto si hay alguna otra tecnología específicamente optimizada para este problema?


En caso de que sea útil para cualquiera que esté lidiando con el mismo problema, aquí está la solución con la que voy.

Estoy usando Lucene con un recopilador personalizado que almacena todos los ID coincidentes, sin ningún procesamiento:

class IDCollector : Collector { // Offset for multiple reader private int docBase; // Stores IDs for all hits public List<int> HitList { get; set; } public IDCollector() { this.HitList = new List<int>(INITIAL_CAPACITY); } public override void Collect(int doc) { HitList.Add(doc + docBase); } // Order of docs does not matter public override bool AcceptsDocsOutOfOrder { get { return true; } } // Default implementation, docBase is the offset from reader public override void SetNextReader(IndexReader reader, int docBase) { this.docBase = docBase; } // Scoring is not necessary public override void SetScorer(Scorer scorer) { } }

De esta forma, es posible recopilar todos los ID de 30 millones para cada documento coincidente en aproximadamente 5,5 segundos para una consulta como term1* OR term2* OR term3* OR term4* .

Desafortunadamente, pero probablemente inevitable, la velocidad de búsqueda depende en gran medida del número de visitas, incluso sin puntuación, clasificación o procesamiento similar de los hits.


Por lo que entiendo, el poder de Lucene / Solr, Sphinx y ElasticSearch es devolver los documentos TOP muy rápido, pero en realidad no están destinados a devolver TODOS los documentos.

En realidad, esto solía ser cierto, pero ha mejorado mucho en los últimos años. Aplazaré a los demás cuando se trata de otras opciones de software, pero Lucene logró algunas mejoras al principio de la serie 4.x para hacer una paginación profunda eficiente con un cursor.

Elasticsearch tiene una API especialmente agradable para esto: la búsqueda de desplazamiento . Para usarlo, proporcione su consulta de búsqueda, con el parámetro de scroll . A continuación, devuelve un cursor scroll_id , que utiliza para realizar solicitudes posteriores para cada página.

Si no le importa ordenar, y solo desea que se devuelvan todos los documentos, también puede especificar un tipo de scan de scan . Eso devolverá todos los documentos en el orden más eficiente, sin aplicar ninguna clasificación en particular.

He pasado por alto algunos de los detalles aquí, querrá ver la documentación de Scrolling Search para una descripción más completa.

Solr también admite paginación profunda a partir de Solr 4.7 en SOLR-5463 . Agrega soporte para un parámetro cursorMark que se utilizará junto con sus solicitudes de búsqueda. Solr luego devuelve un nextCursorMark apuntando a cada página siguiente.

Consulte la sección "Uso de cursores" en la documentación de Paginación de resultados de Solr.

Parece que OP ya está familiarizado con esas opciones, pero pensé que valía la pena desarrollarse por el bien de los demás con una pregunta similar.

También es interesante: mi opinión sobre la mecánica y la eficiencia de una búsqueda de desplazamiento Elasticsearch .