如何使用 NEST 与 ElasticSearch 进行 guid 匹配
How to do a guid match with ElasticSearch using NEST
我有 ES 文档,其中一个字段是一个 guid。
当我尝试进行匹配时,破折号在我的搜索中造成严重破坏,我得到了一堆不相关的部分匹配。
由于此字段是一个 guid,因此它始终需要完全匹配。
在 Kibana 中,我可以将 guid 括在引号中并得到完全匹配;对于 NEST,引号无济于事。我也试图逃避破折号但没有成功。
我需要按原样存储 guid,因为在某些情况下我必须在检索文档时保持 guid 不变,所以我无法删除其中的破折号。
有没有办法用 NEST 标记那个字段,这样当我查询它时,只有完全匹配的 returned?
编辑:
按照下面的答案,这是我所做的:
我在 guid 字段中添加了 [Nest.Keyword]
我是这样查询的:
var R = await _ElasticClient.SearchAsync<PictureObject>(Sr => Sr
.Query(Q => Q.Term(Te => Te
.Field(F => F.AlbumId) <- the guid field
.Value(IdString)); <- my value
但这 return 什么都没有。
弹性站点的文档给出了一个例子(https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/terms-query-usage.html):
q
.Terms(c => c
.Name("named_query")
.Boost(1.1)
.Field(p => p.Description)
.Terms("term1", "term2")
)
我找不到任何关于 Name 方法的文档,而且我所做的看起来很相似,对于单个字段,所以我不知道它对我的情况有什么影响,如果有的话。
我的领域的映射,从 Kibana 看,是:
"mapping": {
"pictureobject": {
"properties": {
"AlbumId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
,
将 Guid
映射为 keyword
type and use term level queries such as term
query 以查找完全匹配项。
我参加聚会迟到了,但您可以像这个示例一样使用 MatchPhrase Methode:
await _elasticClient.SearchAsync<Employee>(
s => s.Index(IndexName).Query(
q => q.MatchPhrase(tq =>
tq.Field(x => x.DepartmentId).Query(dep.Id.ToString())))
我有 ES 文档,其中一个字段是一个 guid。
当我尝试进行匹配时,破折号在我的搜索中造成严重破坏,我得到了一堆不相关的部分匹配。
由于此字段是一个 guid,因此它始终需要完全匹配。
在 Kibana 中,我可以将 guid 括在引号中并得到完全匹配;对于 NEST,引号无济于事。我也试图逃避破折号但没有成功。
我需要按原样存储 guid,因为在某些情况下我必须在检索文档时保持 guid 不变,所以我无法删除其中的破折号。
有没有办法用 NEST 标记那个字段,这样当我查询它时,只有完全匹配的 returned?
编辑: 按照下面的答案,这是我所做的:
我在 guid 字段中添加了 [Nest.Keyword]
我是这样查询的:
var R = await _ElasticClient.SearchAsync<PictureObject>(Sr => Sr .Query(Q => Q.Term(Te => Te .Field(F => F.AlbumId) <- the guid field .Value(IdString)); <- my value
但这 return 什么都没有。
弹性站点的文档给出了一个例子(https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/terms-query-usage.html):
q
.Terms(c => c
.Name("named_query")
.Boost(1.1)
.Field(p => p.Description)
.Terms("term1", "term2")
)
我找不到任何关于 Name 方法的文档,而且我所做的看起来很相似,对于单个字段,所以我不知道它对我的情况有什么影响,如果有的话。
我的领域的映射,从 Kibana 看,是:
"mapping": {
"pictureobject": {
"properties": {
"AlbumId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
,
将 Guid
映射为 keyword
type and use term level queries such as term
query 以查找完全匹配项。
我参加聚会迟到了,但您可以像这个示例一样使用 MatchPhrase Methode:
await _elasticClient.SearchAsync<Employee>(
s => s.Index(IndexName).Query(
q => q.MatchPhrase(tq =>
tq.Field(x => x.DepartmentId).Query(dep.Id.ToString())))