11

solrを使用してドキュメントを検索し、このクエリ ""を使用してドキュメントを検索しようとするとid:*、*または?を使用してクエリを解析できないことを示すこのクエリパーサー例外が発生します。最初の文字として。

HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery

type Status report

message org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery

description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery).

これを*だけで動作させるためのパッチはありますか?それとも、そのようなクエリを実行するのは非常にコストがかかりますか?

4

7 に答える 7

15

すべてのドキュメントが必要な場合は、*:* に対してクエリを実行します。

特定のフィールド (id など) を持つすべてのドキュメントが必要な場合は、id:[* TO *] を試してください。

于 2008-09-16T16:52:54.640 に答える
9

Lucene では、デフォルトでアスタリスクを使用して WildcardQueries を開始することはできません。これは、非常にコストのかかるクエリであり、大きなインデックスでは非常に非常に遅くなるからです。

Lucene QueryParser を使用している場合は、 setAllowLeadingWildcard(true) を呼び出して有効にします。

特定のフィールド セットを持つすべてのドキュメントが必要な場合は、QueryParser を使用するよりも、プログラムでインデックスをクエリまたはウォークする方がはるかに優れています。ユーザー入力を解析するには、実際には QueryParser のみを使用する必要があります。

于 2008-08-22T18:19:22.037 に答える
5
id:[a* TO z*] id:[0* TO 9*] etc.

インデックスの lukeall でこれを実行したところ、機能したため、標準のクエリ パーサーを使用する Solr で機能するはずです。私は実際にSolrを使用していません。

ベースの Lucene では、すべてのドキュメントに対してクエリを実行しないのには十分な理由があります。ドキュメントをクエリするには、 を使用しnew indexReader("DirectoryName")てクエリを適用する必要があるからです。したがって、クエリの適用を完全にスキップして、indexReaderメソッドnumDocs()を使用してすべてのドキュメントの数document(int n)を取得し、任意のドキュメントを取得することができます。

于 2008-08-22T21:33:14.647 に答える
4

すべてのドキュメントを取得しようとしているだけであれば、Solr は *:* クエリをサポートしています。Solr が * でクエリを開始できることを私が知っているのは、このときだけです。おそらく、Solr 管理ページのデフォルト クエリとしてこれを見たことがあると思います。

id:*456 のように、最初の文字として * を使用してより具体的なクエリを実行しようとしている場合、私が見た最良の方法の 1 つは、そのフィールドを 2 回インデックス付けすることです。1 回は通常 (フィールド名: id)、1 回はすべての文字を反転 (フィールド名: reverse_id) します。次に、代わりにクエリ reverse_id:654 を送信することで、基本的にクエリ id: 456 を実行できます。それが理にかなっていることを願っています。

このような質問が頻繁に寄せられるhttp://www.mail-archive.com/solr-user@lucene.apache.org/で、Solr ユーザー グループのメーリング リストを検索することもできます。

于 2008-09-19T18:40:27.920 に答える
2

次の Solr の問題は、デフォルトの lucene クエリ パーサーを構成できるようにするための要求です。 https://issues.apache.org/jira/browse/SOLR-218

この号では、Solr に「パッチ」を適用する方法について、次の説明を見つけることができます。この変更により、* でクエリを開始できるようになります。

Jonas Salk: 基本的に、SolrQueryParser.java という 1 つの Java ファイルだけを更新しました。

public SolrQueryParser(IndexSchema schema, String defaultField) { 
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true); 
    ... 
}

 ...

public SolrQueryParser(QParser parser, String defaultField, Analyzer analyzer) {
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true);
    ... 
}

setLowercaseExpandedTerms が必要かどうかわかりません...

于 2011-08-01T14:26:06.553 に答える
1

私は id:* を使用して、すべてのドキュメントを一致させようとしているだけだと思いますよね?

これまでに solr を使用したことはありませんが、私の Lucene の経験では、データを取り込むときにすべてのドキュメントに隠しフィールドを追加し、すべてのレコードを返す必要があるときに、そのフィールドで文字列定数を検索します。どのレコードも同じです。

状況でそのようなフィールドを追加できない場合は、id フィールドで見つかる可能性のあるものすべてに一致する正規表現で RegexQuery を使用できます。

編集:実際に質問に答えます。それを機能させるためのパッチについては聞いたことがありませんが、かなりうまく機能させることができれば驚くでしょう. 制約のない PrefixQuery が問題を引き起こす理由については、この質問を参照してください。

于 2008-08-19T18:15:55.530 に答える
1

実際、私はこれに対する回避策を使用しています。ID に文字を追加します (例: A1、A2 など)。

フィールドにそのような値がある場合、クエリを使用して検索することができますid:A*

しかし、真の解決策が存在するかどうかを知りたいです。

于 2008-08-20T06:19:10.023 に答える