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?
Lassen Sie mich wissen, wenn Sie Fragen haben, oder ich kann etwas zu meiner Antwort hinzufügen. –
Ich werde es mir ansehen. –
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. –