Consulta en Lucene
-
14-09-2019 - |
Pregunta
La estructura de la tabla "testtable" es
ID int clave primaria
producto int
ID de atributo int
valorvarchar(250)
Donde ProductID es la identificación única de un producto, AttributeID es la identificación única del atributo de un producto, por ejemplo,tamaño, calidad, altura, color y 'valor' es el valor del atributo
Tengo que filtrar un resultado.Alcanzo el requisito mediante esta consulta.Pero no puedo hacerlo en una consulta.
select a.* from dbo.testtable a
where a.attributeId=10 and a.[Value]='Romance'
and productId in
(
select productId
from
dbo.testtable where attributeId =7 and [Value]='Hindi'
)
Necesito ayuda para construir esta consulta.
Solución
Creo que tienes que hacer esto en dos pasos:
Paso 1:extraer identificadores de productos
BooleanQuery query = new BooleanQuery();
query.add(new TermQuery("attributeId", 7), BooleanClause.Occur.MUST);
query.add(new TermQuery("value", "hindi"), BooleanClause.Occur.MUST);
TopDocs docs = searcher.search(query, null, searchLimit);
Luego necesitas extraer el ID del producto de los documentos.
Paso 2:ejecutar consulta
BooleanQuery query = new BooleanQuery();
query.add(new TermQuery("attributeId", 10), BooleanClause.Occur.MUST);
query.add(new TermQuery("value", "Romance"), BooleanClause.Occur.MUST);
// build "IN" clause
BooleanQuery pidQuery = new BooleanQuery();
for( long productId : productIds ){
pidQuery.add(new TermQuery("productId", productId), BooleanClause.Occur.SHOULD);
}
query.add(pidQuery, BooleanClause.Occur.MUST);
TopDocs docs = searcher.search(query, null, searchLimit);
Otros consejos
Considere el uso de Hibernate Search, que le proporciona la semántica de la búsqueda basada en lucene en una base de datos.Alternativamente, mire a Luke y descubra cómo Lucene ha indexado sus datos.Juegue con él y le ayudará a formular consultas de Lucene, ya que le brindará una visión más profunda de la indexación y búsqueda de Lucene.