Pregunta

Estoy usando Hibernate Search (que utiliza Lucene) para buscar algunos datos que he indexado en un directorio. Funciona bien, pero tengo que hacer una búsqueda inversa. Por inversa buscar quiero decir que tengo una lista de consultas almacenadas en mi base de datos que necesito para comprobar cuál de estas consultas que coincida con un objeto de datos cada vez que se crea objetos de datos. Lo necesito para alertar al usuario cuando un objeto de datos coincide con una consulta que ha creado. Así que necesito para indexar este objeto de datos única que acaba de ser creado y ver qué consultas de mi lista tiene este objeto como consecuencia de ello.

He visto Lucene MemoryIndex Clase para crear un índice en la memoria para que pueda hacer algo como este ejemplo para cada consulta en una lista (aunque la iteración en una lista de Java de las consultas no sería muy eficiente):

//Iterating over my list<Query>
MemoryIndex index = new MemoryIndex();
//Add all fields
index.addField("myField", "myFieldData", analyzer);
...
QueryParser parser = new QueryParser("myField", analyzer);
float score = index.search(query);
if (score > 0.0f) {
    System.out.println("it's a match");
} else {
    System.out.println("no match found");
}

El problema aquí es que esta clase de datos tiene varias anotaciones de Hibernate búsqueda @ @ campo, IndexedEmbedded, ... lo que indica cómo se deben indexar los campos, por lo que cuando el método index () en la instancia FullTextEntityManager Invóquelo utiliza esta información para índice del objeto en el directorio. ¿Hay una manera similar al índice en la memoria utilizando esta información?

¿Hay una manera más eficiente de hacer esta búsqueda inversa?

¿Fue útil?

Solución

Índice Sólo el nuevo objeto (si se utiliza la indexación automática usted no tiene que hacer nada, además de confirmar la transacción actual), a continuación, recuperar las consultas que desea ejecutar y ejecutar todos ellos en una consulta booleana, combinando el almacenado consulta con el identificador del nuevo objeto. Algo como esto:

...
BooleanQuery query = new BooleanQuery();
query.add(storedQuery, BooleanClause.Occur.MUST);
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST);
... 

Si se obtiene un resultado que sabes la consulta emparejado.

Otros consejos

Desde MemoryIndex es un componente completamente separado que no se extiende o implementan Directorio de Lucene o IndexReader, creo que no hay una manera que puede tapar esto en la búsqueda de Hibernate Anotaciones. Supongo que si usted elige utilizar MemoryIndex, tendrá que escribir su addField () las llamadas que básicamente espejos de lo que está haciendo en las anotaciones.

¿Cuántas consultas estamos hablando aquí? Dependiendo de cuántos son usted podría ser capaz de salirse con sólo correr las consultas en el índice principal que mantiene Hibernate, asegurando para limitar la búsqueda a la ID de documento que acaba de añadir. O para cada documento que se agrega, crear un índice de un documento de la memoria en el uso de RAMDirectory y ejecutar las consultas a través de eso.

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