Aem fulltextsearch

时间:2016-03-06 12:47:01

标签: lucene cq5 aem

我想使用查询构建器在aem中的所有节点中搜索单词的精确组合。 尝试调试查询http://localhost:4502/libs/cq/search/content/querydebug.html,它返回的结果与我的查询不匹配。 例如,如果想要搜索' foo bar'在所有节点中,我需要接收包含' Foo Bar',' foo Bar',' Foo bar',' FOO BAR&#39的所有节点;但不仅仅是' foo'并且只有' bar'而不是' foo-bar'。服务中的查询是使用QueryBuilder完成的。

6 个答案:

答案 0 :(得分:1)

当您尝试执行类似于SQL的查询时,QueryBuilder很有用,您可以在其中搜索属性及其值。您经历过的查询调试界面的全文搜索功能非常有限。

但是,请记住,AEM使用底层的Lucene和/或Solr索引,它确实提供了一种执行本机solr / lucene查询的方法。

AEM对本机solr查询的支持有点不完整。您可能需要手动编辑SOLR模式xml文件(在crx-quickstart文件夹下创建)以添加其他过滤器,自定义字段等。我们已成功调整了AEM中的solr以使用上述方法执行空间搜索。

答案 1 :(得分:0)

如果您需要" foo bar" 的各种组合,那么您必须查询:
fulltext=foo bar

您只能获得前10个结果。为了得到所有,你需要:
p.limit=-1

您可能需要指定路径:
path=/content/website/

访问Adobe Query Builder API了解详情。

答案 2 :(得分:0)

在幕后,AEM创建一个xpath查询然后执行它。然后,对于没有映射到xpath的查询的任何部分,它会遍历结果并过滤它们。

您还应该考虑是否存在匹配的属性而不是任何文本。由于您需要准确性,这将为您提供更好的结果。现在你正在施展一个过宽的网络,我认为你应该考虑限制除了性能原因之外的其他因素。只是一个建议。

您说结果与您的查询不符,您能否告诉我们回复的内容?你能否在这里提出你的实际问题。这将使得帮助变得更加容易。

答案 3 :(得分:0)

这是提供全文搜索的最小示例:

Query query = queryBuilder.createQuery(...);    
// limit path 
Predicate path = new Predicate(PathPredicateEvaluator.PATH);
path.set(PathPredicateEvaluator.PATH, "/content/where/ever);
query.getPredicates().add(path);
// Fulltext
Predicate fulltextSearch = new Predicate(FulltextPredicateEvaluator.FULLTEXT);
fulltextSearch.set(FulltextPredicateEvaluator.FULLTEXT, "foo bar");
fulltextSearch.set(FulltextPredicateEvaluator.REL_PATH, "jcr:content");
query.getPredicates().add(fulltextSearch);

// can I haz excerpt?
query.setExcerpt(true);
// Paging?
query.setStart(...);
query.setHitsPerPage(-1);

注意:它不需要配置solr索引或其他任何东西,你应该可以开箱即用。 但是,如果将搜索限制为特定字段,则应在oak:index中创建索引条目。你可以找到一本很棒的作弊表here

答案 4 :(得分:0)

我不确定这是否有帮助。

但是为了获得具有我正在寻找的文本的节点的所有组合,我在xpath中使用jcr:like

例如,如果我想在其值或键中搜索具有Foo bar的任何属性的所有节点,那么我的查询如下所示:

/jcr:root/content/yourpath//*[jcr:like(\*/, '%FOO bar%')]

答案 5 :(得分:0)

在QueryBuilder中你不会获得这种灵活性,但你仍然可以通过使用JCR-SQL2得到你想要的东西。

以下查询将返回所有条目,包括“Foo Bar”,“foo bar”,“foo Bar”,“Foo bar”,但不是“foo”,“bar”,“foo-bar”,当您的值为“foo bar”。

SELECT * FROM [nt:unstructured] WHERE ISDESCENDANTNODE('/jcr:root/content/yourpath') AND LOWER([prop]) LIKE "%foo bar%" ORDER BY [cq:lastModified] desc

只需确保在检查存储库中的值时,您将以小写形式发送,以进行不区分大小写的搜索。

对于区分大小写的搜索,您可以使用:

SELECT * FROM [nt:unstructured] WHERE ISDESCENDANTNODE('/jcr:root/content/yourpath') AND [prop] LIKE "%foo bar%" ORDER BY [cq:lastModified] desc