2014-04-23 9 views
5

Ich baue eine Autocomplete-Funktion mit ElasticSearch. Während der Benutzer eingibt, möchte ich eine Liste der Vervollständigungen aus den Daten anzeigen, sodass der Benutzer einen auswählen kann. Wenn beispielsweise die Daten enthält die folgenden Sätze:ElasticSearch Phrase Präfix Suche - Wie bekomme ich die passende Phrase?

very unusual 
very unlikely 
very useful 

und der Benutzer:

very u 

Ich möchte über die Sätze angezeigt werden soll.

Ich bin mit dieser Abfrage:

"query": { 
    "multi_match": { 
     "query": "very u", 
     "fields": [ 
     "name", 
     "description", 
     "contentBlocks.caption", 
     "contentBlocks.text" 
     ], 
     "type": "phrase_prefix", 
     "max_expansions": 10, 
     "cutoff_frequency": 0.001 
    } 

Dies entspricht den Inhalt ich suche, aber die angepassten Sätze aus den Suchergebnissen zu extrahieren ist ziemlich umständlich. Ich habe Highlighting verwendet und sammle die passenden Phrasen durch Parsing der Highlights. Zum Beispiel:

"highlight": { 
     "contentBlocks.text": [ 
     "turned the <em>very</em> <em>unusual</em> doorknob" 
     ] 
    } 

    "highlight": { 
     "contentBlocks.text": [ 
     "invented a <em>very</em> <em>useful</em> mechanism" 
     ] 
    } 

Was ist der richtige Weg, dies zu tun?


„Phrase Suggester“ könnte der Lage sein, zu tun, was ich beschrieben habe, aber es ist überhaupt nicht klar, wie würden Sie es, das zu tun bekommen.

"description" : { 
    "index_analyzer" : "snowball_stem", 
    "search_analyzer" : "snowball_stem", 
    "type" : "string", 
    "fields" : { 
     "autocomplete" : { 
     "index_analyzer" : "shingle_analyzer", 
     "search_analyzer" : "shingle_analyzer", 
     "type" : "string" 
     } 
    } 
    }, 

ich den snowball_stem Analysator für die Suche und die shingle_analyzer für die Funktion zur automatischen Vervollständigung bin mit:

Ich habe die Interessengebiete (zum Beispiel „description“) wie folgt indiziert. shingle_analyzer sieht wie folgt aus:

"settings" : { 
    "analysis" : { 
     "analyzer" : { 
      "shingle_analyzer" : { 
       "type" : "custom", 
       "tokenizer" : "standard", 
       "filter" : [ 
        "standard", 
        "lowercase", 
        "shingle_filter" 
       ], 
       "char_filter" : [ 
        "html_strip" 
       ] 
      } 
     }, 
     "filter" : { 
      "shingle_filter" : { 
       "type" : "shingle", 
       "min_shingle_size" : 2, 
       "max_shingle_size" : 2 
      } 
     } 
    } 
}, 

Die Dokumentation für die Phrase suggester scheint völlig orientiert „Rechtschreibkorrektur“ zu werden, anstatt Abschluss. Da das, was nach dem ich bin, ist Abschluss, stelle ich die min_word_length direkten Generator und Präfixlänge der Länge des eingegebenen Textes, in diesem Fall 2.

ich einen Vorschlag Abfrage gestaltete up basiert auf der Dokumentation:

{ 
    "text" : "sa", 
    "autocomplete_description" : { 
     "phrase" : { 
      "analyzer" : "standard", 
      "field" : "description.autocomplete", 
      "size" : 10, 
      "max_errors" : 2, 
      "confidence" : 0.0, 
      "gram_size" : 2, 
      "direct_generator" : [ 
       { 
        "field" : "description.autocomplete", 
        "suggest_mode" : "always", 
        "size" : 10, 
        "min_word_length" : 2, 
        "prefix_length" : 2 
       } 
      ] 
     } 
    } 
} 

Diese Suche nach Anregungen für „sa“ kommt mit den folgenden Ergebnissen auf:

{ 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "autocomplete_description" : [ { 
    "text" : "sa", 
    "offset" : 0, 
    "length" : 2, 
    "options" : [ { 
     "text" : "say", 
     "score" : 0.012580795 
    }, { 
     "text" : "sa", 
     "score" : 0.01127677 
    }, { 
     "text" : "san", 
     "score" : 0.0106529845 
    }, { 
     "text" : "sad", 
     "score" : 0.008533429 
    }, { 
     "text" : "saw", 
     "score" : 0.008107899 
    }, { 
     "text" : "sam", 
     "score" : 0.007155634 
    } ] 
    } ] 
} 

Was erwarte ich für die Eingabe „sa“ finden Wörter, die mit „sa“ in beliebiger Länge beginnen. Warum gibt es nur Wörter mit zwei oder drei Zeichen zurück? Warum gibt es nur sechs Optionen zurück? Die multi_match phrase_prefix-Abfrage, die ich verwendet habe, findet viele längere Wörter, die mit "sa" beginnen, wie "Speichern", "Sassy", "Safari" und "Salat".

Wenn ich nach Vorschlägen für Mehrworttext suche, wie "Eins oder" (was häufig in den Daten vorkommt), findet es nichts. Die Abfrage multi_match phrase_prefix findet "ein oder mehrere", "eins oder eins", "eins oder eins" und "eins oder beide".

Wie kann ich diesen Suggester dazu bringen, das zu tun, was ich möchte?

+0

Lassen Sie mich wissen, wenn Sie Fragen haben, oder ich kann etwas zu meiner Antwort hinzufügen. –

+0

Ich werde es mir ansehen. –

+0

Ich habe versucht, Phrase Suggester zu verwenden, um dies zu tun, aber ich hatte nicht viel Erfolg. Ich fügte Informationen über meine Experimente und detailliertere Fragen zur obigen Problembeschreibung hinzu. –

Antwort

1

Sie können mit der completion suggester grob bekommen, was Sie wollen. Das Hauptproblem dabei ist, dass es nicht mehr bewusst ist.Sie können dies beheben, indem Sie eine suggester context hinzufügen, aber es funktioniert nur für Filter und berücksichtigt den Suchtext nicht.

Der einzige Weg, die ich kenne, die „besten“ Verhalten (kontextbezogene Suchvervollständigungen) zu erhalten, ist folgendes zu tun:

  • erstellen suggestions Feld, in dem der Text in Token aufgeteilt wird, wie Sie es wollen würde, vom Benutzer gesehen werden (wahrscheinlich Standard-Analysator oder vielleicht auf einem 2-Shingle-Token-Filter hinzufügen).
  • Nehmen wir an, der Benutzer gibt die unvollständige Abfrage very un aus. Hinter den Kulissen suchen Sie nach very und verwenden Sie dann term aggregations, um eine Liste von Begriffen zu erhalten, die dem Suchkontext entsprechen, aber die mit "include": "un.*" zurückgegebenen Begriffe einschränken.
  • Die resultierende Liste wird wie folgt aussehen [ungewöhnlich, unwahrscheinlich, uncool].

Das einzige Problem mit dieser Methode, vor allem in einer sharded Umgebung ist, dass es eine Menge von Anfragen ist und Sie eine sehr hohe Mächtigkeit Feld (suggestions) in dem Speicher zu ziehen. Also ... ich weiß nicht, ob das praktisch machbar ist. Vielleicht ist es besser, mit dem Abschlussvorschlag zurück zu gehen. Wenn Sie eine dieser beiden Möglichkeiten ausprobieren, interessiert mich Ihre Erfahrung.

+1

Danke, dass du dir das angesehen hast, @JnBrymn. Ich habe den Code verwendet, den ich ursprünglich beschrieben habe, indem ich die phrase_prefix-Abfrage verwendet habe und die Highlights nachbearbeitet habe. Es scheint wie ein Hack, aber es funktioniert zuverlässig und Leistung ist überraschend gut. –

Verwandte Themen