Boost Database by AI Search: No results even when AI Search finds something
>>> [!note] Migrated issue <!-- Drupal.org comment --> <!-- Migrated from issue #3556572. --> Reported by: [tim.steinberg](https://www.drupal.org/user/3727263) >>> <h3 id="summary-problem-motivation">Problem/Motivation</h3> <p>First of all, I'm not sure if this is a bug or if this is intended to be this way.</p> <p>I have set up a Database Search which uses Milvus to boost the results with an AI Search.<br> The Database Search is simple and uses only two fields. I want to use the Database Search only for exact matches (like SKU codes), since the AI Search does not perform well for this type of search.</p> <p>I want an entity node (which is found by the AI Search) to always be included in the results, regardless of whether it matches the word patterns used by the Database Search.</p> <p>However, currently I do not get it back unless it is present in the filtered data returned by the Database Search.</p> <p>I investigated the code and extracted this SQL query, which seems to be the cause of the issue:</p> <pre>SELECT COUNT(*) AS "expression"<br>FROM (<br>&nbsp;&nbsp;&nbsp; SELECT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.item_id AS "item_id",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM(t.score) AS "score",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 AS "expression",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN t.item_id = 'entity:node/9909:de' THEN 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END AS "ai_boost"<br>&nbsp;&nbsp;&nbsp; FROM (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.item_id AS "item_id",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM(t.score) AS "score",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE WHEN t.word LIKE '%runde 40%' THEN 1 ELSE 0 END AS "w1",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE WHEN t.word LIKE '%40 mm%' THEN 1 ELSE 0 END AS "w2",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE WHEN t.word LIKE '%mm etiketten%' THEN 1 ELSE 0 END AS "w3"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; search_api_db_pages_search_text_5 t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.word LIKE '%runde 40%' ESCAPE '\\'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR t.word LIKE '%40 mm%' ESCAPE '\\'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR t.word LIKE '%mm etiketten%' ESCAPE '\\'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND t.field_name IN ('sku', 'software_code')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP BY<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.item_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w2,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w3<br>&nbsp;&nbsp;&nbsp; ) t<br>&nbsp;&nbsp;&nbsp; LEFT OUTER JOIN search_api_db_pages_search t_2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON t.item_id = t_2.item_id<br>&nbsp;&nbsp;&nbsp; WHERE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_2.search_api_language IN ('de', 'und')<br>&nbsp;&nbsp;&nbsp; GROUP BY<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.item_id<br>&nbsp;&nbsp;&nbsp; HAVING<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SUM(w1) &gt;= 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR (SUM(w2) &gt;= 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR (SUM(w3) &gt;= 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR (t.item_id IN ('entity:node/9909:de'))<br>&nbsp;&nbsp;&nbsp; ORDER BY<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai_boost DESC<br>) subquery;</pre><p>You can see that the node found by AI (entity:node/9909:de) is intended to be included in the final results.</p> <p>However, because the innermost subquery only selects item_ids that match the WHERE clause:</p> <pre>WHERE (<br>&nbsp; t.word LIKE '%runde 40%'<br>&nbsp; OR t.word LIKE '%40 mm%'<br>&nbsp; OR t.word LIKE '%mm etiketten%'<br>)<br>AND (t.field_name IN ('sku', 'software_code'))</pre><p> ...the outer aggregations will never see entity:node/9909:de unless it is present in the filtered data, so it does not get included in the final result as I would expect it.</p> <h3 id="summary-proposed-resolution">Proposed resolution</h3> <p>Update the SQL query logic so that database search results always include nodes found by the AI search, even if they do not match the current word patterns or filters.</p>
issue