15

Lucene を使用して、ユーザーが多数のドキュメント内の単語を検索できるようにしています。Lucene は、入力された単語のいずれかを含むすべてのドキュメントを返すようにデフォルト設定されているようです。

この動作を変更することは可能ですか? 「+」を使用して用語を強制的に含めることができることは知っていますが、それをデフォルトのアクションにしたいと思います。

理想的には、Google と同様の機能が必要です。「-」で単語を除外し、「abc xyz」で単語をグループ化します。

明確 にするために、クエリのすべてのスペースに「+」を挿入することも考えました。グループ化された用語 (括弧、引用符など) を検出してクエリを壊す可能性を避けたかっただけです。別のアプローチはありますか?

4

5 に答える 5

32

これは、 Lucene Sentence Searchの質問に似ています。興味があれば、これが私がその質問に答えた方法です:

String defaultField = ...;
Analyzer analyzer = ...;
QueryParser queryParser = new QueryParser(defaultField, analyzer);

queryParser.setDefaultOperator(QueryParser.Operator.AND);

Query query = queryParser.parse("Searching is fun");
于 2009-01-27T12:58:01.377 に答える
2

Adamが言ったように、クエリ文字列に対して何もする必要はありません。QueryParser のsetDefaultOperatorは、まさにあなたが求めていることを行います。

于 2009-01-29T08:36:59.373 に答える
0

動作は、クラス org.apache.lucene.queryParser.QueryParser のメソッド addClause(List, int, int, Query) にハードコーディングされているため、動作を変更する唯一の方法 (上記の回避策以外) は、そのメソッドを変更することです。 . メソッドの最後は次のようになります。

if (required && !prohibited)
  clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST));
else if (!required && !prohibited)
  clauses.addElement(new BooleanClause(q, BooleanClause.Occur.SHOULD));
else if (!required && prohibited)
  clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST_NOT));
else
  throw new RuntimeException("Clause cannot be both required and prohibited");

"SHOULD" を "MUST" に変更すると、句 (単語など) がデフォルトで必須になります。

于 2009-01-17T00:52:50.067 に答える
0

ユーザーの検索入力を事前に解析し、Lucene クエリ構文を使用して条件に合わせて調整してから、Lucene渡してみませんか。または、標準構文を使用して特定のクエリを作成し、ユーザーにクエリの実行方法を決定させる方法に関するヘルプ ドキュメントを作成することもできます。

于 2009-01-16T14:43:57.267 に答える
0

Lucene には、ここで説明されているように広範なクエリ言語があり、+ がデフォルトであることを除いて必要なものはすべて記述されていますが、これはスペースを + に置き換えることで簡単に処理できるものです。したがって、ユーザーが検索クエリを入力する際に​​使用する形式を定義するだけで (既定の Lucene 構文を使用することを強くお勧めします)、独自の構文から Lucene 構文への変換を記述できます。

于 2009-01-16T14:45:18.373 に答える