使用Xamarin.Forms与NEST进行Guid ID比较无法正常工作

时间:2016-09-14 10:32:04

标签: elasticsearch xamarin xamarin.forms cross-platform nest

我正在使用 Xamarin 6.1 为iOS和Android开发应用程序,而我正在使用 Xamarin.Forms 2.3.1 该应用程序使用包含Guid ID的 ZXing.Net.Mobile.Forms 2.1.4 扫描QR,并将其作为字符串保存到我的ElasticSearch中。要与ElasticSearch连接我正在使用NEST 2.x

问题在于,当我再次扫描相同的QR时(当我确定它已经被索引时),它被检测为新的,即使值是相同的(两者都作为字符串进行比较)。但是我尝试在存储或比较之前从id中删除破折号( - )并且它有效。

这是我的模特:

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

result.Text 是我从QR获得的,我知道这是一个字符串,这就是我索引它的方式:

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()
                      );

这就是我检查QR是否已经存在的方式:

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");
}

在创建它时,我也尝试将属性设置为.NotAnalyse,如here中建议的那样,但仍然不起作用。

任何人都有任何想法?欢迎一切!

谢谢!

1 个答案:

答案 0 :(得分:3)

我会将id POCO上的Box字段设置为未分析

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

id属性仍将被编入索引,但不会进行分析,因此将逐字编入索引。

我还会使用

检查文档是否存在
var existsResponse = client.DocumentExists<Box>("document-id", e => e.Index("airstorage").Type("boxes"));

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

但是 ,实际上我想你想要的是use optimistic concurrency control索引调用中的创建文档,即如果文档不存在那么索引它,但如果确实存在则返回409 Conflict无效响应。 OpType.Create可用于此

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}");
    }
}