使用 Xamarin.Forms 与 NEST 进行 Guid ID 比较无效
Guid ID comparison with NEST using Xamarin.Forms not working
我正在使用 Xamarin 6.1 为 iOS 和 Android 开发应用程序,我正在使用 Xamarin.Forms 2.3.1
该应用程序使用 ZXing.Net.Mobile.Forms 2.1.4 扫描包含 Guid Id 的 QR,并将其作为字符串保存到我的 ElasticSearch 中。要连接 ElasticSearch,我使用的是 NEST 2.x
问题是,当我再次扫描同一个二维码时(当我确定它已经被索引时)它被检测为一个新二维码,即使值是相同的(都作为字符串进行比较)。但是,在存储或比较它们之前,我尝试从 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()
);
这就是我检查二维码是否已经存在的方法:
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");
}
我也试过在创建 ElasticSearch 中的索引时将 属性 设置为 .NotAnalyse,就像 中建议的那样,但仍然不起作用。
有人知道吗?欢迎一切!
谢谢!
我会将您的 Box
POCO 上的 id
字段设置为不分析
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")
}
BUT,实际上我认为你想要的是 use optimistic concurrency control 用于索引调用中的创建文档,即如果该文档不存在然后索引它,但如果它确实存在然后 return 409 冲突无效响应。 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}");
}
}
我正在使用 Xamarin 6.1 为 iOS 和 Android 开发应用程序,我正在使用 Xamarin.Forms 2.3.1 该应用程序使用 ZXing.Net.Mobile.Forms 2.1.4 扫描包含 Guid Id 的 QR,并将其作为字符串保存到我的 ElasticSearch 中。要连接 ElasticSearch,我使用的是 NEST 2.x
问题是,当我再次扫描同一个二维码时(当我确定它已经被索引时)它被检测为一个新二维码,即使值是相同的(都作为字符串进行比较)。但是,在存储或比较它们之前,我尝试从 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()
);
这就是我检查二维码是否已经存在的方法:
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");
}
我也试过在创建 ElasticSearch 中的索引时将 属性 设置为 .NotAnalyse,就像
有人知道吗?欢迎一切!
谢谢!
我会将您的 Box
POCO 上的 id
字段设置为不分析
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")
}
BUT,实际上我认为你想要的是 use optimistic concurrency control 用于索引调用中的创建文档,即如果该文档不存在然后索引它,但如果它确实存在然后 return 409 冲突无效响应。 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}");
}
}