Force replace some HTML tags before sending messages to the search index
authorAlexander Ebert <ebert@woltlab.com>
Wed, 29 Mar 2023 16:24:45 +0000 (18:24 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Wed, 29 Mar 2023 16:24:45 +0000 (18:24 +0200)
Stripping the HTML can cause certain words to be accidentally joined when there is no symbol between them that is recognized by the tokenizer. Inserting a whitespace at tag positions that are known to be prone is a stop-gap solution until we find a more stable replacement strategy.

See #4652 and WoltLab/com.woltlab.wcf.elasticSearch#14

wcfsetup/install/files/lib/system/search/SearchIndexManager.class.php

index 4c51d7afa1f950302ae053af8cd65fb2db31f5e7..a9f887422a84f3ecfebe42836e02e77c8e71b491 100644 (file)
@@ -122,6 +122,24 @@ class SearchIndexManager extends SingletonFactory implements ISearchIndexManager
         $languageID = null,
         $metaData = ''
     ) {
+        // Force replace certain tags with a whitespace to prevent words from adjacent
+        // lines to be glued together.
+        $message = \str_replace([
+            '<br>',
+            '</h1>',
+            '</h2>',
+            '</h3>',
+            '</h4>',
+            '</h5>',
+            '</h6>',
+            '</kbd>',
+            '</li>',
+            '</p>',
+            '</pre>',
+            '</td>',
+            '</woltlab-metacode>',
+        ], ' ', $message);
+
         // strip html; remove whitespace from beginning and end of the message
         $message = StringUtil::trim(StringUtil::stripHTML($message));