我想使用查询构建器在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完成的。
答案 0 :(得分:1)
当您尝试执行类似于SQL的查询时,QueryBuilder很有用,您可以在其中搜索属性及其值。您经历过的查询调试界面的全文搜索功能非常有限。
但是,请记住,AEM使用底层的Lucene和/或Solr索引,它确实提供了一种执行本机solr / lucene查询的方法。
select [jcr:path] from [nt:base] where native('solr', '<filter>?<solr_query_goes_here>'
。很明显,您需要熟悉solr查询。感谢以下幻灯片分享(幻灯片50讨论了AEM中的本机查询)http://www.slideshare.net/justinedelson/demystifying-oak-search AEM对本机solr查询的支持有点不完整。您可能需要手动编辑SOLR模式xml文件(在crx-quickstart文件夹下创建)以添加其他过滤器,自定义字段等。我们已成功调整了AEM中的solr以使用上述方法执行空间搜索。
答案 1 :(得分:0)
如果您需要&#34; foo bar&#34; 的各种组合,那么您必须查询:
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