Global change generated by SearchAsh. Keeps the search_text attribute in sync with
the configured fields, stemmed in the row's language via SearchCore.
It only recomputes when it needs to — on create, or on an update that actually changes
a search field or the language — so unrelated updates skip the stemmer entirely. It
never recomputes from partially-loaded data: if a search field isn't loaded (e.g. an
update issued with a narrowed select), it leaves the existing search_text intact
rather than dropping that field's content from the index.