7

特定のフレーズを検索すると、TridionContentManagerで次のエラーが発生することに気付きました。

Unable to get the list of search results.
Unable to process the Search Request. Invalid search query: (*out*) AND RepositoryId:tcm\:0\-4\-1 AND OrganizationalItemAncestorIds:tcm\:*\-135625\-2. maxClauseCount is set to 10240
org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 10240
at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:136)
at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:127)
at org.apache.lucene.search.ScoringRewrite$1.addClause
[...and so on]

上記の例では、フレーズを検索しています*out**a*また、フレーズやその他のさまざまな小さなワイルドカードクエリを検索しても失敗します。検索をアイテムのタイトルだけに限定すると、正常に機能out*し、正常に機能します。*out*「すべての出版物」で検索するか、特定のフォルダで検索するかは関係ありません。検索結果を最小値(50)に制限してもかまいません。

多分これは返された結果の数と関係がありますか?

Tridion 5.3でもまったく同じ検索が正常に機能しますが、Luceneを使用していないと思いますか?

これを修正する方法について何かアイデアはありますか?

4

1 に答える 1

10

主要なワイルドカードは、インデックス付けと検索の方法が原因で、Luceneでは許可されていません(TridionのバージョンR5.3はそれらを許可するVerity実装を使用していました)。先頭のワイルドカードを使用すると、インデックスを使用して一致を見つけるためのより一般的でパフォーマンスの高い方法を使用するのではなく、インデックスですべての用語の一致を効果的にスキャンします(Lucene FAQを参照) 。

を呼び出すことQueryParser.setAllowLeadingWildcard(true)でこれを有効にできますが、ほとんどの場合、これを無効にすることを強くお勧めします。

より良いアプローチは、クエリに渡すのではなく、先頭のワイルドカードを必要とする用語でフィルタリングすることです(先頭のワイルドカード用語が検索される唯一の用語である場合、実際には実行可能ではありません)

また、LuceneはReverseStringFilterを提供します。これは、すべての用語を逆に索引付けするフィルターです。これはおそらく、主要なワイルドカード検索を有効にするためのインデックスを作成するための最良の方法です。

すぐに、これらのどちらも実際にはクエリを処理するとは思いません*out*。データをN-Gramsとして表すことは、そのためのオプションかもしれません(NGramTokenizerを参照)。

于 2012-11-29T16:59:00.850 に答える