elasticsearch - example - Comparación de ID de Guid con NEST con Xamarin.Forms no funciona
elasticsearch c# (1)
Yo establecería el campo de id
en su Box
POCO para que no sea analizado
public class Box
{
[String(Index = FieldIndexOption.NotAnalyzed)]
public string id { get; set; }
public string lastUpdate { get; set; }
}
La propiedad de id
seguirá indexada, pero no se analizará, por lo que se indexará textualmente.
También verificaría la existencia del documento usando
var existsResponse = client.DocumentExists<Box>("document-id", e => e.Index("airstorage").Type("boxes"));
if (!existsResponse.Exists)
{
Console.WriteLine("document exists")
}
PERO , en realidad lo que creo que desea es usar control de concurrencia optimista para el documento de creación en la llamada de índice, es decir, si el documento no existe, entonces indéntelo, pero si existe, entonces devuelva una respuesta inválida 409 Conflicto. OpType.Create
se puede usar para esto
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}");
}
}
Estoy desarrollando una aplicación para iOS y Android con Xamarin 6.1 y estoy usando Xamarin.Forms 2.3.1 La aplicación escanea un QR usando ZXing.Net.Mobile.Forms 2.1.4 que contiene una ID de guía y la guarda como una encadenado a mi ElasticSearch. Para conectar con ElasticSearch estoy usando NEST 2.x
El problema es que cuando escaneo el mismo QR nuevamente (cuando sé con certeza que ya está indexado) se detecta como uno nuevo incluso aunque los valores sean los mismos (ambos comparados como cadenas). Sin embargo, traté de eliminar los guiones (-) de la identificación antes de almacenarlos o compararlos y funciona.
Este es mi modelo:
public class Box
{
[String(Analyzer = "null")]
public string id { get; set; }
public string lastUpdate { get; set; }
}
result.Text es lo que obtengo del QR y sé con certeza que es una cadena, y así es como lo indico:
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()
);
Y así es como compruebo si el QR ya existe:
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");
}
También intenté establecer la propiedad como .NotAnalyse en el índice de ElasticSearch cuando lo creé como se sugiere aquí, pero todavía no funciona.
Alguien tiene alguna idea? ¡Todo es bienvenido!
¡Gracias!