2016-08-02 21 views
-1

Ich habe ein Feld "Suchtext", dass ich ein Unterfeld "Schindel" zur Verfügung gestellt habe und ich Indexierung dieses Suchtextfeld mit einem Schindeln-Filter.Elasticsearch 2.x - Zurückgeben einer Liste von Schindeln

Ich brauche die Liste der Schindeln, die für dieses Feld erstellt wurden, damit ich einige Operationen für dieses Feld ausführen kann. Wenn ich das Feld "suchtext.single" abrufe, enthält es nur den ursprünglichen Text.

Bedeutet das, dass der Schindel-Analysator, den ich eingerichtet habe, nicht funktionierte, oder dass ich die Liste der Schindeln auf andere Weise zurückbekommen muss?

+0

'bereitgestellt ein Unterfeld "shingle" meinen Sie im Mapping oder im aktuellen json-Dokument? Wenn das erste, wie erhalten Sie die Suchtext.Single-Feld an erster Stelle? – keety

+0

Ich habe eine Zuordnung zu einer Eigenschaft mit dem Namen: "Suchtext" In meiner Zuordnung habe ich eine Zuordnung zu "Suchtext.single" erstellt, so dass ich explizit die Schindeln abrufen konnte, die erstellt wurden. Normalerweise verwende ich das Mapping zu meiner Dokumentklasse, aber diese Zuordnung existiert nicht direkt, da dieses Feld gerade von dem von mir erstellten Mapping erstellt wird. Ich möchte die Felder verwenden, um bestimmte Datenfelder selbst abzurufen, anstatt die Dokumentzuordnung zu verwenden, da diese mit der Menge der zurückgegebenen Daten sehr umfangreich werden kann. –

Antwort

1

Sie können die _termvectors endpoint wie dies unter Verwendung aller Bedingungen Ihres „geschuppt“ Feld abrufen:

Antwort
curl -XGET 'http://localhost:9200/your_index/your_type/1/_termvectors?pretty=true' -d '{ 
    "fields" : ["searchtext.shingle"], 
    "offsets" : true, 
    "payloads" : true, 
    "positions" : true, 
    "term_statistics" : true, 
    "field_statistics" : true 
}' 
+0

etwas Glück dabei? – Val

+0

HI, Danke für Ihren Kommentar. Genau das habe ich gebraucht. –

+0

Super, froh, dass es geholfen hat! – Val

0

Neben Val ist, können Sie auch testen, wie ein Analysator mit Hilfe der API-Analyse funktioniert. Als Beispiel wollen wir einen eigenen Analysator bauen und testen Sie dann, was Token es für einen gegebenen Eingang testen

var analysisResponse = client.Analyze(a => a 
    .Index(defaultIndex) 
    .Analyzer("my_shingle_analyzer") 
    .Text("This is the text I want to analyze") 
); 

foreach (var token in analysisResponse.Tokens) 
{ 
    Console.WriteLine($"{token.Token}"); 
} 

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
var defaultIndex = "analyzer-test"; 
var connectionSettings = new ConnectionSettings(pool) 
     .DefaultIndex(defaultIndex); 

var client = new ElasticClient(connectionSettings); 

if (client.IndexExists(defaultIndex).Exists) 
    client.DeleteIndex(defaultIndex); 

client.CreateIndex(defaultIndex, c => c 
    .Settings(s => s 
     .Analysis(a => a 
      .TokenFilters(tf => tf 
       .Shingle("my_shingle", sh => sh 
        .MaxShingleSize(3) 
        .OutputUnigrams() 
       ) 
      ) 
      .Analyzers(an => an 
       .Custom("my_shingle_analyzer", sa => sa 
        .Tokenizer("standard") 
        .Filters("lowercase", "my_shingle") 
       ) 
      ) 
     ) 
    ) 
); 

Jetzt produziert emittiert die folgenden Token

this 
this is 
this is the 
is 
is the 
is the text 
the 
the text 
the text i 
text 
text i 
text i want 
i 
i want 
i want to 
want 
want to 
want to analyze 
to 
to analyze 
analyze 
+0

Danke. Ich habe den Analysator direkt mit JSON getestet, denke aber an den .NET-Code! –