使用通配符搜索Content Manager时出错

时间:2012-11-29 14:35:14

标签: lucene tridion tridion-2011

我注意到如果我搜索某些短语,Tridion Content Manager会给我以下错误

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?

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:10)

Lucene不允许使用前导通配符(Tridion的R5.3版本使用了允许它们的Verity实现),因为它被索引和搜索的方式。前导通配符有效地使索引扫描每个匹配项,而不是使用索引查找匹配的更典型和高性能方法(请参阅Lucene FAQ

您可以通过致电QueryParser.setAllowLeadingWildcard(true)来启用此功能,但我强烈建议您在大多数情况下不要这样做。

更好的方法可能是过滤需要前导通配符的术语,而不是将它们传递给查询(如果前导通配符是唯一被搜索的术语,则不可行)

此外,Lucene还提供ReverseStringFilter,这是一个过滤器,它也会反向索引所有术语。这可能是创建索引以启用前导通配符搜索的最佳方法。

关闭,我认为其中任何一个都不会真正处理像*out*这样的查询。将数据表示为N-Grams可能是一种选择(参见NGramTokenizer)。