2016-03-06 2 views
1

Я хочу найти точное сочетание слов во всех узлах в aem с помощью построителя запросов. Пытаясь отладить запрос http://localhost:4502/libs/cq/search/content/querydebug.html, он возвращает мне результаты, которые не соответствуют моему запросу. Например, если вы хотите найти «foo bar» во всех узлах, и мне нужно получить все узлы, содержащие «Foo Bar», «foo Bar», «Foo bar», «FOO BAR», но не только «foo» и только «бар», а не «foo-bar». Запрос на обслуживание выполняется с помощью QueryBuilder.Aem fulltextsearch

+0

Я не знаю, AEM, но если он использует синтаксис запроса Lucene, окружают его в кавычки: '«Foo бар»'. Вы все равно найдете «foo-bar», но при стандартном анализе индексированная форма этого неотличима от «foo bar», так что это изменит ваш анализ и переиндексирование. – femtoRgon

ответ

0

Если вам нужны все виды комбинаций для «Foo бар», то вы должны запросить:
fulltext=foo bar

Вы получите только первые 10 результатов. Для того, чтобы получить все, вам нужно:
p.limit=-1

Вы можете указать путь:
path=/content/website/

Посетите Adobe Query Builder API для получения дополнительной информации.

0

За кулисами AEM создает запрос xpath и затем выполняет его. Затем для любой части запроса, которая не сопоставляется с xpath, она просматривает результаты и фильтрует их.

Вы также должны подумать о том, есть ли свойство для сопоставления в отличие от любого текста. Это даст вам гораздо лучшие результаты, так как вы хотите точности. Прямо сейчас вы бросаете слишком широкую сеть, и я думаю, вам стоит подумать о том, чтобы ограничиться, если ничего, кроме служебных соображений. Просто предложение.

Вы скажете, что результаты не соответствуют вашему запросу, можете ли вы дать нам некоторое представление о том, что возвращается? И можете ли вы задать свой фактический запрос здесь. Это облегчит вам помощь.

1

QueryBuilder полезен, когда вы пытаетесь выполнить запрос, похожий на SQL, где вы выполняете поиск по свойству и его значению. Полнотекстовые возможности поиска интерфейса отладки запросов очень ограничены, как вы уже испытали.

Однако помните, что AEM использует базовый индекс Lucene и/или Solr, и это дает возможность выполнить собственный запрос solr/lucene.

  • Во-первых, создать встроенный индекс Solr (встроенный достаточно для развития локального экземпляра AEM), как упоминалось в разделе «Настройка AEM со встроенным ГУМЗ сервера» в https://docs.adobe.com/docs/en/aem/6-0/deploy/upgrade/queries-and-indexing.html. Это вызовет индексацию вашего JCR-контента.
  • Как только индексирование завершено (как видно из журналов), вы можете выполнять собственные запросы, используя интерфейс запроса crx/de. Пример запроса: 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 немного неоднородна. Возможно, вам придется вручную отредактировать XML-файл схемы SOLR (созданный в папке crx-quickstart), чтобы добавить дополнительные фильтры, настраиваемые поля и т. Д. Мы успешно настроили solr в AEM для выполнения пространственного поиска с использованием вышеуказанного метода.

+0

нет, вам не нужно настраивать встроенный индекс solr. Поиск lucene поддерживается без какой-либо дополнительной настройки и подходит для большинства случаев использования. – deveth0

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 или любой другой, вы должны быть хорошо из коробки. Но если вы ограничиваете поиск конкретными полями, вы должны создать индексную запись в дубе: index. Вы можете найти отличный чит-лист here.

0

Я не уверен, если это поможет.

, но для получения всех комбинаций узлов, у которых есть текст, который я ищу, я использую jcr:like в xpath.

, например, если я хочу, чтобы найти все узлы, которые имеют любое свойство с Foo bar его стоимостью или ключом, то мой запрос выглядит следующим образом:

/jcr:root/content/yourpath//*[jcr:like(\*/, '%FOO bar%')] 
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 
Смежные вопросы