Lucene でのクエリ
-
14-09-2019 - |
質問
テーブル「testtable」の構造は次のとおりです。
id int 主キー
積整数
属性ID int
値 varchar(250)
ProductIDが製品の一意のIDである場合、属性は製品の属性の一意のIDです。サイズ、品質、高さ、色、「値」は属性の値です
結果をフィルタリングする必要があります。このクエリで要件を達成します。しかし、クエリではそれを行うことができません。
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'
)
このクエリを作成するには助けが必要です。
解決
これは 2 つのステップで行う必要があると思います。
ステップ1:製品IDを抽出する
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);
次に、ドキュメントから productId を抽出する必要があります。
ステップ2:クエリを実行する
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);
他のヒント
データベース上で lucene ベースの検索のセマンティクスを提供する Hibernate Search の使用を見てください。あるいは、luke を見て、lucene がデータにどのようにインデックスを作成したかを確認してください。これを試してみると、lucene のインデックス作成と検索をより深く調べることができるため、lucene クエリを組み立てるのに役立ちます。
所属していません StackOverflow