2017-08-15 2 views
0

Exécution d'un site Bergeronnette (1.11) avec ElasticSearch (5.5) comme arrière-plan de la recherche et l'indexation de plusieurs champs, par exemple:Comment récupérer le champ qui a déclenché un coup pour une requête ElasticSearch

search_fields = Page.search_fields + [ 
    index.SearchField('body'), 
    index.SearchField('get_post_type_display'), 
    index.SearchField('document_excerpt', boost=2), 
    index.SearchField('get_dark_data_full_text'), 
] 

Je voudrais indiquer dans quel champ la recherche atterrit un 'hit' dans mon modèle de résultats de recherche (ou mieux encore afficher un extrait du hit, mais cela semble être une autre question).

This question semble résoudre mon problème, mais je ne sais pas comment l'intégrer dans mon site wagtail.

Des conseils pour obtenir ces informations et comment les intégrer dans la recherche de wagtail?

Répondre

1

ElasticSearch possède l'API Explain qui peut expliquer comment il comptabilise en interne les résultats par champ pour un enregistrement spécifique avec un ID spécifique.

Voici la documentation:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html

Il vous donne certainement une réponse sur la façon dont chaque domaine a été renforcé et comment le score a été construit. Par exemple, si vos résultats max_score étaient 2.0588222 et que vous voulez savoir comment les champs ont contribué à cette partition, vous pouvez utiliser l'API EXPLAIN.

Voici un exemple d'une réponse à la requête expliquer où vous voyez ce champ prenom a contribué 1,2321436 au score max et lastName a contribué 0,8266786:

{ 
    "_index" : "customer_test", 
    "_type" : "customer", 
    "_id" : "597f2b3a79c404fafefcd46e", 
    "matched" : true, 
    "explanation" : { 
    "value" : **2.0588222**, 
    "description" : "sum of:", 
    "details" : [ { 
     "value" : 2.0588222, 
     "description" : "sum of:", 
     "details" : [ { 
     "value" : **1.2321436**, 
     "description" : "weight(firstName:merge in 23) [PerFieldSimilarity], result of:", 
     "details" : [ { 
      "value" : 1.2321436, 
      "description" : "score(doc=23,freq=1.0 = termFreq=1.0\n), product of:", 
      "details" : [ { 
      "value" : 1.2321436, 
      "description" : "idf, computed as log(1 + (docCount - docFreq + 0.5)/(docFreq + 0.5)) from:", 
      "details" : [ { 
       "value" : 3.0, 
       "description" : "docFreq", 
       "details" : [ ] 
      }, { 
       "value" : 11.0, 
       "description" : "docCount", 
       "details" : [ ] 
      } ] 
      }, { 
      "value" : 1.0, 
      "description" : "tfNorm, computed as (freq * (k1 + 1))/(freq + k1 * (1 - b + b * fieldLength/avgFieldLength)) from:", 
      "details" : [ { 
       "value" : 1.0, 
       "description" : "termFreq=1.0", 
       "details" : [ ] 
      }, { 
       "value" : 1.2, 
       "description" : "parameter k1", 
       "details" : [ ] 
      }, { 
       "value" : 0.75, 
       "description" : "parameter b", 
       "details" : [ ] 
      }, { 
       "value" : 1.0, 
       "description" : "avgFieldLength", 
       "details" : [ ] 
      }, { 
       "value" : 1.0, 
       "description" : "fieldLength", 
       "details" : [ ] 
      } ] 
      } ] 
     } ] 
     }, { 
     "value" : 0.8266786, 
     "description" : "weight(lastName:doe in 23) [PerFieldSimilarity], result of:", 
     "details" : [ { 
      "value" : 0.8266786, 
      "description" : "score(doc=23,freq=1.0 = termFreq=1.0\n), product of:", 
      "details" : [ { 
      "value" : **0.8266786**, 
      "description" : "idf, computed as log(1 + (docCount - docFreq + 0.5)/(docFreq + 0.5)) from:", 
      "details" : [ { 
       "value" : 3.0, 
       "description" : "docFreq", 
       "details" : [ ] 
      }, { 
       "value" : 7.0, 
       "description" : "docCount", 
       "details" : [ ] 
      } ] 
      }, { 
      "value" : 1.0, 
      "description" : "tfNorm, computed as (freq * (k1 + 1))/(freq + k1 * (1 - b + b * fieldLength/avgFieldLength)) from:", 
      "details" : [ { 
       "value" : 1.0, 
       "description" : "termFreq=1.0", 
       "details" : [ ] 
      }, { 
       "value" : 1.2, 
       "description" : "parameter k1", 
       "details" : [ ] 
      }, { 
       "value" : 0.75, 
       "description" : "parameter b", 
       "details" : [ ] 
      }, { 
       "value" : 1.0, 
       "description" : "avgFieldLength", 
       "details" : [ ] 
      }, { 
       "value" : 1.0, 
       "description" : "fieldLength", 
       "details" : [ ] 
      } ] 
      } ] 
     } ] 
     } ] 
    }, { 
     "value" : 0.0, 
     "description" : "match on required clause, product of:", 
     "details" : [ { 
     "value" : 0.0, 
     "description" : "# clause", 
     "details" : [ ] 
     }, { 
     "value" : 1.0, 
     "description" : "_type:customer, product of:", 
     "details" : [ { 
      "value" : 1.0, 
      "description" : "boost", 
      "details" : [ ] 
     }, { 
      "value" : 1.0, 
      "description" : "queryNorm", 
      "details" : [ ] 
     } ] 
     } ] 
    } ] 
    } 
} 

A propos Bergeronnette: Je n'ai aucune expérience avec elle. Mais vous pouvez certainement accéder à l'API REST et analyser le JSON d'une requête Explain.

+0

Cela semble génial @ gil.fernandes - mais je ne sais pas comment utiliser cette fonctionnalité en utilisant le _wagtail construit dans la recherche avec elasticsearch comme backend_ et serait heureux si quelqu'un pouvait me diriger vers une implémentation exemplaire – tombreit