2017-07-07 4 views
0

Ich verwende elastische Suche Version 2.x. Und ich habe zwei Datensätze, die als indiziert werden:Elastische Suche Sortieren und Ranking

  1. Bad Wandfliese (als „Nickname“ indizierte Dokument Spalte)
  2. Fliesen Wand Badezimmer (als „Nickname“ indexierte Spalte Dokument)

Wenn Ich versuche, nach dem Ausdruck zu suchen "Kachel Wand Badezimmer" idealerweise sollte zweitens zuerst erscheinen, weil das genau passt und danach wird zuerst erscheinen, weil alle 3 Wörter übereinstimmt (Kachel, Wand und Bad).

Ich sortiere in meiner Abfrage basierend auf Spalten. Unten ist meine elastische Suchabfrage:

{ 
          "query" : { 
           "filtered" : { 
             "query" : { 
              "query_string": { 
               "query": "*tile wall bathroom*", 
               "fields": [ 
                "nickname", 
                "comments", 
                "category_name", 
                "subcategory_name", 
                "document_name", 
                "web_links", 
                "document_extension", 
                "property_name", 
                "document_content" 
               ],              
               "analyze_wildcard": true 
              } 
             }, 
             "filter" : { 
              "and" : [ 
                {"term" : {"property_id" : "6"}} 
              ] 
             } 
           } 
          }, 
          "size": 10, 
          "sort": ["nickname", "comments", "web_links", "document_name"] 
        } 

Als Referenz finden Sie bitte angehängtes Bild. enter image description here

Vielen Dank im Voraus !!!

Antwort

1

Alle Ihre 3 Begriffe getroffen, da beide Dokumentenfelder aus "Badezimmer", "Kachel" und "Wand" bestehen. So ist es üblich, beide Dokumente als Treffer zu erhalten. Wie Sie vorschlagen, sollte das erste Dokument im Allgemeinen, wenn nach Punktzahl sortiert, höher eingestuft werden als das zweite.

Da Ihr erstes Sortierfeld das "Nickname" -Feld ist, erhalten Sie dieses Ergebnisset, wo zuerst alle Dokumente in alphabetischer Reihenfolge nach ihrem "Nickname" -Feld sortiert werden (b in "Badezimmerwandfliese" kommt) vor t "Fliesenwand Badezimmer", etc). Dies schließt die Sortierung nach Relevanz-Score für Ihre Suchanfrage aus. Sie können stattdessen "nickname" als sekundären Sortierparameter und das "_score" -Feld als erstes verwenden.

Sie können Ihre Abfrage auch mit der Funktion Elasticsearch- explain überprüfen.

Cheers, Dominik

Edit: Bitte versuchen Sie Ihre Abfrage für die Elasticsearch- Explain-API, zu laufen, die zu verstehen, ermöglicht es, wie Ihr Ergebnis berechnet wurde. Darüber hinaus können Sie eine Match-Abfrage für Ihre Daten ausführen, um zu sehen, ob sich Ihre Ergebnisse gegen die Verwendung von "query_string" verbessern. Sie können auch die Sortierparameter weglassen, um die Ergebnisse nur nach ihrem Relevanzwert zu sortieren.

{ 
    "query": { 
     "match": { 
      "nickname": "tile wall bathroom" 
     }, 
     "size": 10, 
     "sort": ["_score", "nickname", "comments", "web_links", "document_name"] 
    } 
} 
+0

Danke Dominik. Kannst du mir bitte schreiben, was du erklärst. Ich habe versucht, "_scrore" -Feld zuerst zu setzen, aber es zeigt das gleiche Ergebnis. –

+0

Danke Chocomesli. Aber diese Abfrage funktioniert überhaupt nicht. –

+0

Haben Sie die Explain-API getestet? – chocomuesli