Jak dodać dodatkowe pola com_content do Smart Search Index

10

Gdzie mogę znaleźć samouczek lub instrukcje do budowy wtyczki obsługującej „onPrepareFinderContent”?

Dodałem dodatkowe pola do artykułów com_content i chciałbym, aby były one indeksowane przez silnik Findera.

Szukam sposobu dodania nowego elementu do FinderIndexerResultobiektu, który będzie indeksowany.

Widziałem ten wiersz kodu we wtyczkach / finder / content / content.php w wierszu 311:

// Get content extras.
FinderIndexerHelper::getContentExtras($item);

Funkcja FinderIndexerHelper :: getContentExtras akceptuje obiekt FinderIndexerResult, który będzie indeksowany, a następnie wyzwala zdarzenie „onPrepareFinderContent”, które (jak sądzę) umożliwia wtyczce 3dparty dodawanie lub modyfikowanie treści, które będą indeksowane.

Niektórzy z was mają jakieś doświadczenie w tym zakresie lub mogą wskazać mi dobry tutorial / dokumentację?

Cristiano
źródło

Odpowiedzi:

4

Zrobiłem wiele dodatkowych pól w com_content. Myślę, że ponieważ metoda użyta do tego jest dość niestandardowa, gdy określasz własną tabelę, i tak nie ma naprawdę powtarzalnej metody, której można by użyć do scalenia tych informacji w com_finder.

Moją propozycją byłoby rozwidlenie wtyczki indeksatora treści dla wyszukiwarki, a następnie skonfigurowanie jej do wywoływania dodanych pól.

Pierwszą rzeczą, którą musisz zrobić, to zmodyfikować getListQuery w wyszukiwarce, aby dołączyć do tabeli dodatkowych pól:

https://github.com/joomla/joomla-cms/blob/staging/plugins/finder/content/content.php#L341

Następnie, w zależności od tego, jak zapiszesz dodatkowe pola (obiekt JRegistry?), Musisz po prostu powiedzieć wyszukiwarce, aby spojrzał na dodatkowe pola, które masz w zapytaniu:

Mam wrażenie, że w końcu dodałeś je jako niektóre meta informacje: https://github.com/joomla/joomla-cms/blob/staging/plugins/finder/content/content.php#L286

Mam nadzieję że to pomoże

Czad Windnagle
źródło
3

Pracując dla wtyczki SobiPro-Smart Search, dodaliśmy dodatkowe pola w getItems , przetwarzając elementy, które mają być indeksowane jako FinderIndexerResult, a później w indeksie dla każdego elementu, dodając instrukcje dla każdego dodatkowego pola:

protected function index(FinderIndexerResult $item, $format = 'html')
{
...

            $fields = $this->_fields[$item->section];

            foreach ($fields as $f)
            {
                $nid = $f->get('nid');

                if (isset($item->$nid))
                {
                    $item->addInstruction(FinderIndexer::TEXT_CONTEXT, $nid);
                }
            }
...
Anibal
źródło
Dziękuję, twoja odpowiedź podpaliła mnie we właściwym kierunku;) W końcu napisałem wtyczkę finder (rozszerza JPlugin), która implementuje zdarzenie onPrepareFinderContent (uruchamiane przez FinderIndexerHelper :: getContentExtras). Następnie dodałem instrukcje, jak pokazałeś, oraz odpowiednie dodatkowe pola: public function onPrepareFinderContent(FinderIndexerResult &$row) { .... $row->addInstruction(FinderIndexer::TEXT_CONTEXT, $field->id); $row->setElement($field->id, $field->value); .... }
Cristiano
Świetny! Czy musisz oznaczyć pytanie jako rozwiązane?
Anibal
@Cristiano: Czy kiedykolwiek to rozwiązałeś? Nie ma akceptowanej odpowiedzi, a ja mam ten sam problem - czy kiedykolwiek wymyśliłeś, jak korzystać z tych procedur?
PKB
Nawet jeśli odpowiedź nie zostanie zaakceptowana przez pierwotnego autora ... tak to działa na mojej inteligentnej wtyczce wyszukiwania ;-)
Anibal