0

国のリストなどの条件を使用して検索したとします。ユーザーは、検索する国のセットを選択し、このセットを他の基準と組み合わせることができます。

SQLでは、where句でこれを行います。つまり、WHERE(country ='brazil' OR country ='france' OR country ='china)AND(その他の検索条件)です。

Luceneでこれを行う方法は明確ではありません。Query.combineには有望なようですが、複数の「OR」用語のセットを処理する場合、複雑さが急速に増します。

Luceneはこの点で能力がありますか?または、これらのタイプの基準で通常のDBをヒットし、Luceneの結果をフィルター処理する必要がありますか?

深く掘り下げると、これを達成するためにブールクエリをネストできるように見えます。このテクニックが機能し、パフォーマンスが高い場合は、回答を更新します。

4

2 に答える 2

6

標準のクエリパーサーを使用すると(関連するドキュメントを参照できます)、次のようなDBクエリと同様の構文を使用できます。

 (country:brazil OR country:france OR country:china) AND (other search criteria)

または、少し単純化するために:

 country:(brazil OR france OR china) AND (other search criteria)

あるいは、Luceneは、AND/OR構文ではなく+/-を使用して記述されたクエリもサポートします。その構文は、Luceneクエリに対してより表現力があります。この形式の同等のものは次のようになります。

 +country:(brazil france china) +(other search criteria)

手動でクエリを作成する場合は、実際にBooleanQueriesをネストして同様の構造を作成し、正しいBooleanClausesを使用して指定したAnd/Orロジックを確立できます。

Query countryQuery = new BooleanQuery();
countryQuery.add(new TermQuery(new Term("country","brazil")),BooleanClause.Occur.SHOULD);
countryQuery.add(new TermQuery(new Term("country","france")),BooleanClause.Occur.SHOULD);
countryQuery.add(new TermQuery(new Term("country","china")),BooleanClause.Occur.SHOULD);

Query otherStuffQuery = //Set up the other query here, 
//or get it from a query parser, or something

Query rootQuery = new BooleanQuery();
rootQuery.add(countryQuery, BooleanClause.Occur.MUST);
rootQuery.add(otherStuffQuery, BooleanClause.Occur.MUST);
于 2013-03-22T16:35:02.380 に答える
1

ふたつのやり方。

  1. Luceneにクエリを作成させます。これを実現するには、次の形式でクエリ文字列を送信します。

    クエリ:「国(ブラジルフランス中国)」

    組み込みのQueryParserは、上記の文字列をOR演算子を使用してBooleanQueryに解析します。

QueryParser qp = new QueryParser(Version.LUCENE_41, "country", new StandardAnalyzer(Version.LUCENE_41));
Query q = qp.parse(s);
  1. 自分でクエリを作成する場合は、
BooleanQuery bq = new BooleanQuery();
//
TermQuery tq = new TermQuery(new Term("country", "brazil"));
bq.add(tq, Occur.SHOULD); // SHOULD ==> OR operator
//
tq = new TermQuery(new Term("country", "france"));
bq.add(tq, Occur.SHOULD);
// 
tq = new TermQuery(new Term("country", "china"));
bq.add(tq, Occur.SHOULD);

何百ものサブクエリを追加しない限り、Luceneはパフォーマンス面で期待に応えます。

于 2013-03-22T02:44:38.100 に答える