7

我注意到,如果我搜索某些短语 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?

有想法该怎么解决这个吗?

4

1 回答 1

10

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

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

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

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

马上,我认为这些都不能真正处理这样的查询*out*。将您的数据表示为 N-Grams 可能是一种选择(请参阅NGramTokenizer)。

于 2012-11-29T16:59:00.850 回答