Внедрение удобной в использовании поисковой системы в объектах доктрины.
Для базового использования все, что вам нужно сделать, это определить карту поисковых сущностей и их свойства, поисковая система будет организована для правильной загрузки, и будет автоматически сортировать результаты поиска на основе найденных кандидатов.
Цель пакета состоит в том, чтобы предоставить простой API для расширенного полнотекстового поиска в объектах доктрины. В начале запроса строится схема поиска, и этот пакет автоматически гарантирует, что наилучшие результаты найдены и возвращены на основе актуальности.
Чтобы вручную установить композитор вызова пакета и выполнить следующую команду:
$ composer require baraja-core/doctrine-fulltext-search А затем зарегистрируйте DoctrineFulltextSearchExtension в конфигурации Neon:
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension Или вы можете создать экземпляр BarajaSearchSearch вручную.
Поиск выполняется путем создания запроса (картирования сущностей и столбцов):
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer Или вы можете использовать SelectorBuilder с полной проверкой строгих типов и методами подсказки для построения запроса:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;Нет необходимости ускорять выход, вся логика автоматически решается двигателем.
:username - столбец будет использоваться в качестве подписи
!slug - столбец будет использоваться для поиска, но игнорируется в выходе Perex.
_durationTime - столбец будет загружен в сущность, но не будет учитываться при расчете актуальности и не будет включена в Perex.
content.versions.haystack - Отношение между организациями автоматически создает соединение и загружает последнее свойство.
versions(content) - Пользовательский Getter (автоматически присоединяется к столбцу versions , но вызов getContent() для получения данных).
Если мы используем толстую кишку в начале имени столбца (например ':username' ), она будет автоматически использована в качестве заголовка.
Название будет отображаться, даже если он не содержит поисковых слов.
Подпись может быть пустой и не может существовать (может быть null ).
Если заголовок не существует, то двигатель может автоматически рассчитать его в соответствии с наилучшим появлением в найденном тексте.
Поисковый запрос автоматически нормализуется, и остановки удаляются, для чего не имеет смысла поиск.
Алгоритм может быть переопределен в конкретном проекте, внедрив интерфейс IQueryNormalizer и перезаписывая его в контейнере DIC.
Вывод метода search() является объектом типа SearchResult , который реализует интерфейс Iterator для возможности легко проходить через результаты.
Совет: Если вам просто нужно быстро печатать результаты поиска, и требования к внешнему виду не очень высоки, объект
SearchResultнапрямую реализует метод__toString()для легкого рендеринга результатов непосредственно как HTML.
Результаты поиска суммируют все результаты всех поисков во всех объектах. Все результаты получаются методом getItems() - вывод будет массивом объектов типа SearchItem[] .
Тем не менее, нам часто нужно собирать запрос оптом, а затем перечислять, например, категории и продукты отдельно. Для этого используйте Helper Method getItemsOfType(string $type) , который возвращает усеченный массив результатов типа SearchItem[] только для сущностей в соответствии с пройденным параметром.
Мы использовали метод getItems() или getItemsOfType() чтобы получить результаты поиска, через которые мы проходим. Но как работать с определенным результатом?
Важно отметить, что на данный момент у нас больше нет доступного метода __toString() , и мы должны предоставить результат (в идеале в шаблоне).
Для большинства случаев будет достаточно готовых помощников:
getTitle() возвращает заголовок найденного объекта как строки или нулевой.getTitleHighlighted() вызовы getTitle() внутри, и если результат является действительной строкой, он окрашивает входы каждого слова с <i class="highlight"> и </i> .getSnippet() возвращает фрагмент найденной сущности, которая суммирует лучшую найденную область в исходной сущности (например, фрагмент статьи, в котором происходят поисковые слова). Можно вернуть больше фрагментов (индивидуальные события разделены на толстую кишку). Всегда возвращает строку (может быть пустой).getTitleHighlighted() внутренние вызовы getSnippet() и окрашивают входы каждого слова с <i class="highlight"> и </i> .getScore() возвращает относительный (различный контекст в соответствии с поисковым запросом и доступными данными в каждом проекте) Оценка точки результата (в соответствии с этим параметром результаты автоматически отсортированы).getEntity() возвращает первоначальную найденную сущность, которую доктрина произвела внутри. Поиск выполняется с использованием частичного выбора, поэтому не все свойства всегда могут быть доступны.entityToArray() возвращается как массив. Строки автоматически нормализованы. Оба метода получения результатов ( getItems() и getItemsOfType() ) принимают параметры $limit (по умолчанию 10 ) и $offset (по умолчанию 0 ).
Сам пейджинг лучше всего реализован с использованием страниц Nette.
Общее количество результатов получается методом getCountResults() над сущностью SearchResult .
Поисковая система использует PARTIAL для загрузки баз данных и завершает полученные объекты в результаты поиска, поэтому вы можете загрузить их в любое время, вызывая ->getEntity() выше определенного результата поиска.
Если результат не может быть найден, или их число «небольшое» (определение определяется самим алгоритмом в соответствии с анализом конкретного проекта), наконечник для наилучшей коррекции поискового запроса может (и может быть доступен).
Для получения помощи, позвоните в метод getDidYouMean() через SearchResult . Вывод - это либо строка (лучший поисковый запрос), либо NULL.
Лучшая коррекция поискового запроса получается самой поисковой системой на основе расширенного анализа поиска в каждом проекте отдельно с использованием методов машинного обучения . При каждом поиске статистика о поисковом запросе количество результатов и других сигналов автоматически сохраняются и анализируются ретроспективно, если это необходимо.
Получение помощи естественно и не может быть легко под влиянием. Поисковая система стремится к максимальной объективности и предлагает пользователям слова, которые ищут других, и возвращает как можно больше соответствующих результатов в соответствии с текущим контекстом. Внутренне используются сложные математические функции, которые мы постоянно улучшаем, основываясь на опыте всех проектов.
При поиске сначала составлен список кандидатов для результатов поиска. Эти результаты индивидуально передаются через алгоритм оценки, который выполняет автоматическую «относительную» оценку в диапазоне 0 - 512 (на основе различных сигналов, таких как поисковый запрос, недавняя история пользователя, язык, физическое местоположение, содержание объекта и тип) (результат всегда int ).
Согласно оценке точки, результаты автоматически отсортируются.
Алгоритм оценки может быть переопределен, внедрив интерфейс IScoreCalculator и перезаписывая его в контейнере DIC.
baraja-core/doctrine-fulltext-search лицензируется по лицензии MIT. Смотрите файл лицензии для получения более подробной информации.