我注意到如果我搜索某些短语,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?
有关如何解决此问题的任何想法?
答案 0 :(得分:10)
Lucene不允许使用前导通配符(Tridion的R5.3版本使用了允许它们的Verity实现),因为它被索引和搜索的方式。前导通配符有效地使索引扫描每个匹配项,而不是使用索引查找匹配的更典型和高性能方法(请参阅Lucene FAQ)
您可以通过致电QueryParser.setAllowLeadingWildcard(true)
来启用此功能,但我强烈建议您在大多数情况下不要这样做。
更好的方法可能是过滤需要前导通配符的术语,而不是将它们传递给查询(如果前导通配符是唯一被搜索的术语,则不可行)
此外,Lucene还提供ReverseStringFilter,这是一个过滤器,它也会反向索引所有术语。这可能是创建索引以启用前导通配符搜索的最佳方法。
关闭,我认为其中任何一个都不会真正处理像*out*
这样的查询。将数据表示为N-Grams可能是一种选择(参见NGramTokenizer)。