2016-09-14 5 views
3

ich eine App für iOS und Android bin Entwicklung mit Xamarin 6.1 und ich bin mit Xamarin.Forms 2.3.1 Die App scannt ein QR-mit ZXing.Net.Mobile.Forms 2.1.4 enthält eine GUID-ID und speichert sie als String in meinem ElasticSearch. Zur Verbindung mit ElasticSearch verwende ich NEST 2.xGuid ID Vergleich mit NEST mit Xamarin.Forms nicht funktioniert

Das Problem ist, dass, wenn ich das gleiche QR wieder scanne (wenn ich sicher weiß, dass es bereits indiziert ist), wird es als ein neues sogar die Werte erkannt sind die gleichen (beide als Strings verglichen). Allerdings habe ich versucht, die Bindestriche (-) von der ID zu entfernen, bevor sie gespeichert oder verglichen werden und es funktioniert.

Das ist mein Modell:

public class Box 
{ 
    [String(Analyzer = "null")] 
    public string id { get; set; } 
    public string lastUpdate { get; set; } 
} 

result.Text ist das, was ich aus dem QR bekommen, und ich weiß sicher, dass ein String ist, und das ist, wie ich es Index:

scannedQR = result.Text; 

// INDEXING 
var timeStamp = GetTimestamp(DateTime.Now); 
var customBox = new Box { 
          id= scannedQR, 
          lastUpdate = timeStamp 
         }; 
var res = client.Index(customBox, p => p 
         .Index("airstorage") 
         .Type("boxes") 
         .Id(scannedQR) 
         .Refresh() 
        ); 

Und das ist, wie ich überprüfen, ob der QR bereits vorhanden ist:

var resSearch = client.Search<Box>(s => s 
            .Index("airstorage") 
            .Type("boxes") 
            .From(0) 
            .Size(10) 
            .Query(q => q 
              .Term(p => p.id, scannedQR) 
             ) 
            ); 

if (resSearch.Documents.Count() > 0) { 
    Console.WriteLine("EXISTING"); 
} 
else { 
    Console.WriteLine("NEW BOX"); 
} 

Ich habe auch versucht, die Eigenschaft auf .NotAnalyse auf den Index in ElasticSearch beim Erstellen wie in here vorgeschlagen, aber immer noch nicht funktioniert.

Jeder eine Idee? Alles ist willkommen!

Vielen Dank!

Antwort

3

Ich würde das id Feld auf Ihrem Box POCO auf nicht

public class Box 
{ 
    [String(Index = FieldIndexOption.NotAnalyzed)] 
    public string id { get; set; } 
    public string lastUpdate { get; set; } 
} 

Die id Eigenschaft wird noch indiziert werden analysiert aber nicht Analyse unterzogen werden, wird so wörtlich indiziert werden.

würde ich auch überprüfen, für die Existenz des Dokuments mit

var existsResponse = client.DocumentExists<Box>("document-id", e => e.Index("airstorage").Type("boxes")); 

if (!existsResponse.Exists) 
{ 
    Console.WriteLine("document exists") 
} 

ABER, eigentlich das, was ich denke, Sie wollen, ist zu use optimistic concurrency control für die Schaffung Dokument im Index Aufruf dh, wenn das Dokument doesn existiere nicht, indiziere es, aber wenn es existiert, gib eine 409 Konflikt ungültige Antwort zurück. Die OpType.Create kann dafür verwendet werden

var indexResponse = client.Index(box, i => i 
    .OpType(OpType.Create) 
    .Index("airstorage") 
    .Type("boxes")); 

if (!indexResponse.IsValid) 
{ 
    if (indexResponse.ApiCall.HttpStatusCode == 409) 
    { 
     Console.WriteLine("document exists"); 
    } 
    else 
    { 
     Console.WriteLine($"error indexing document: {indexResponse.DebugInformation}"); 
    } 
} 
+0

Vielen Dank @RussCam! Ich habe das POCO zur 'id' Deklaration und zum' .OpType (OpType.Create) 'hinzugefügt und jetzt funktioniert es! – svicente3

+0

kannst du mir vielleicht hier helfen? ^^ 'http://stackoverflow.com/questions/39931708/how-to-store-a-c-sharp-list-of-objects-into-elasticsearch-with-nest-2-x/39932064#39932064 – svicente3