Batakj
Batakj

Reputation: 12743

Query in Lucene

The structure of the table "testtable" is

  1. id int primary key

  2. productid int

  3. attributeid int

  4. value varchar(250)

where productid is the unique id of a product, attributeid is the unique id of attribute of a product e.g. size, quality,height, color and 'value' is the value for the attribute

i have to filter a result. I achieve the requirement by this query. But i am not able to make it in a query.

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'
)

Need help to build this query..

Upvotes: 2

Views: 2843

Answers (2)

Cambium
Cambium

Reputation: 19392

I think you have to do this in two steps:

Step 1: extract product ids

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);

You then need to extract the productId from the docs

Step 2: run query

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);

Upvotes: 4

user121803
user121803

Reputation: 177

Look at using Hibernate Search which provides you with semantics of lucene based searching on a database. Alternatively look at luke and figure out how lucene has indexed your data. Play around with it and it will help you frame lucene queries as it gives you a deeper look into lucene indexing and searching.

Upvotes: 0

Related Questions