2014-07-09 10 views
5

Ist es möglich, Wildcard-Übereinstimmungen und Ngrams in ElasticSearch zu kombinieren? Ich benutze bereits Ngramme der Länge 3-11.Verwendung von Platzhaltern mit Ngrammen in ElasticSearch

Als ein sehr kleines Beispiel habe ich Datensätze C1239123 und C1230123. Der Benutzer möchte beide zurückgeben. Dies ist die einzige Information, die sie kennen: C123? 12

Der obige Fall funktioniert nicht mit meinem vollständigen Spiel Analysator, weil die Abfrage die 3 am Ende fehlt. Ich hatte den Eindruck, dass Wildcard-Übereinstimmungen aus der Box heraus funktionieren würden, aber wenn ich eine ähnliche Suche wie die oben genannten durchführe, bekomme ich Kauderwelsch.

Abfrage:

.Search<ElasticSearchProject>(a => a 
    .Size(100) 
    .Query(q => q 
     .SimpleQueryString(query => query 
      .OnFieldsWithBoost(b => b 
       .Add(f => f.Summary, 2.1) 
       .Add(f => f.Summary.Suffix("ngram"), 2.0) 
      .Query(searchQuery)))); 

Analyzer:

var projectPartialMatch = new CustomAnalyzer 
{ 
    Filter = new List<string> { "lowercase", "asciifolding" }, 
    Tokenizer = "ngramtokenizer" 
}; 

Tokenizer:

.Tokenizers(t=>t 
    .Add("ngramtokenizer", new NGramTokenizer 
    { 
     TokenChars = new[] {"letter","digit","punctuation"}, 
     MaxGram = 11, 
     MinGram = 3 
    })) 

EDIT: Der Hauptzweck ist, damit der Benutzer der Suchmaschine sagen, wo genau die unbekannte Charaktere sind. Dies erhält die Übereinstimmungsreihenfolge. Ich ngram nicht die Abfrage, nur die indizierten Felder.

EDIT 2 mit mehr Testergebnissen: Ich hatte mein vorheriges Beispiel etwas zu sehr vereinfacht. Das Kauderwelsch wurde durch Interpunktionsfilter verursacht. Bei einem richtigen Beispiel gibt es kein Kauderwelsch, aber Ergebnisse werden nicht in einer relevanten Reihenfolge zurückgegeben. Ich bin mir nicht sicher, warum die ersten beiden Ergebnisse überhaupt übereinstimmen. Ngram wird nicht auf die Abfrage angewendet. ?

für c.a123 Suche .7 0 gibt Ergebnisse in dieser Reihenfolge:

  • C.A1234.560
  • C.A1234.800
  • C.A1234.700 < - Sollte das nicht zuerst sein?
  • C.A1234.950
+0

Haben Sie 'c123? 12 *' ausprobiert? Es ist in Ordnung, Wildcard-Matches und Ngrams in ElasticSearch zu kombinieren, aber Sie müssen verstehen, wie es funktioniert. Sonst gibt es unerwartete Ergebnisse –

+0

@ Duc.Duong Ich habe das versucht. Es gibt zwar Ergebnisse zurück, sie scheinen jedoch keine Relevanz für die Abfrage zu haben. – Brandon

+0

Können Sie die übereinstimmenden Ergebnisse veröffentlichen? Wir können mehr darüber untersuchen –

Antwort

1

Um alle, die eine Lösung für dieses suchen, sind Platzhalter auf ngrammed Token standardmäßig verwendet. Mein Problem lag daran, dass meine Abfragen Interpunktionszeichen enthalten und ich einen Standardanalysator für meine Abfrage verwende (der Interpunktionszeichen unterbricht).

Der Vorschlag von Duc.Duong, das Inquisitor-Plugin zu verwenden, half dabei, genau zu zeigen, wie Daten analysiert würden.

Verwandte Themen