Puncte:4

Cum pot adăuga un impuls la o interogare search_api_solr dacă un câmp are o valoare?

drapel in

Încerc să adaug un impuls unei interogări de căutare a apei Solr atunci când un câmp are o anumită valoare, de ex. cand its nid = 123. Privind la Documente Solr versiunea 8.7 pentru amplificare (versiunea mea de server solr), asta pare destul de simplu. Trebuie doar să adaug un parametru bq ca:

bq=nid:123^10

Când merg la interfața de utilizare a serverului meu Solr și adaug o interogare acolo - mai întâi bifând caseta de selectare a analizorului edismax și apoi adăugând nid:123^10 în câmpul bq - văd rezultate în care nodul meu cu nid este în partea de sus a listei (cum m-aș aștepta) cu toate celelalte rezultate după el. Dacă elimin opțiunea, nodul meu cu nid 123 nu mai este în partea de sus (tot așa cum m-aș aștepta).

The search_api_solr modulul oferă un cârlig pentru a modifica interogările, hook_search_api_solr_query_alter(), unde îmi pot adăuga impulsul. (Notă secundară, am folosit acest cârlig în trecut pentru a crește rezultatele pe baza unei date, practic, așa cum este documentat în acest comentariu bkosborne.)

Înțeleg că ar trebui să pot implementa ceva de genul:

function MY_MODULE_search_api_solr_query_alter(\Solarium\Core\Query\QueryInterface $solarium_query, \Drupal\search_api\Query\QueryInterface $interogare) {
  $solarium_query->addParam('bq', 'nid:123^10');
}

Totuși, acest lucru nu are nici un impact asupra scorurilor de relevanță ale rezultatelor mele (tipăresc scorul de relevanță din punctul meu de vedere și nodul meu cu nid 123 are același scor indiferent dacă adaug acest parametru sau nu), și nici, previzibil, ordinea rezultatele.

Ce îmi lipsește aici?

Informații despre versiune:

  • Miez Drupal: 9.1.10
  • API de căutare: 8.x-1.19
  • Căutare API Solr: 4.1.12
  • Server Solr: 8.7.0

p.s. cheia mea de câmp nid este de fapt its_nid în index, dar tocmai am folosit nid în această întrebare pentru lizibilitate.

Puncte:5
drapel in

Trebuia doar să citesc mai atent. Toate informațiile sunt în exemplul de cod din hook_search_api_solr_query_alter() documentație. (Cred că formatul pe care îl foloseam ar fi fost recomandat pentru versiuni mult mai vechi ale search_api_solr, versiuni care abia recent nu mai sunt necesare pe anumite gazde de întreprindere.)

Cel mai simplu mod de a face acest lucru să funcționeze a fost să adaug parametrul defType la interogarea mea pentru a-i spune să folosească parserul edismax. Acest lucru este documentat în hook_search_api_solr_query_alter(). Următoarele lucrări:

function MY_MODULE_search_api_solr_query_alter(\Solarium\Core\Query\QueryInterface $solarium_query, \Drupal\search_api\Query\QueryInterface $interogare) {
  $solarium_query->addParam('bq', 'nid:123^10');
  // Evitați conversia într-o expresie de parser lucene, păstrați edismax.
  $solarium_query->addParam('defType', 'edismax');
}

Cu toate acestea, citind documentație cârlig, arată o abordare alternativă care pare de preferat:

function MY_MODULE_search_api_solr_query_alter(\Solarium\Core\Query\QueryInterface $solarium_query, \Drupal\search_api\Query\QueryInterface $interogare) {
  $boost_queries['special_node'] = [
    'query' => 'nid:123^10.0',
  ];
  $boost_queries['some_less_special_node'] = [
    'query' => 'nid:321^5.0',
  ];
  /** @var \Solarium\Component\EdisMax $edismax */
  $edismax = $solarium_query->getEDisMax();

  $edismax->addBoostQueries($boost_queries);

  // Evitați conversia într-o expresie de parser lucene, păstrați edismax.
  $solarium_query->addParam('defType', 'edismax');
}

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.