我有ES文档,其中字段是Guid。
当我尝试进行比赛时,破折号对我的搜索造成了破坏,并且我得到了一堆无关的局部比赛。
由于此字段为Guid,因此始终需要完全匹配。
在Kibana中,我可以将guid括在引号中,并获得完全匹配;使用NEST,引用无济于事。我还试图逃脱破折号,但没有成功。
我需要按原样存储guid,因为在某些情况下,我必须检索完好guid的文档,因此无法删除其中的破折号。
是否可以使用NEST标记该字段,以便在查询时仅返回完全匹配的内容?
编辑: 按照下面的答案,这是我所做的:
我在[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
但这不会返回任何内容。
弹性站点的文档给出了一个示例(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
}
}
}
,
答案 0 :(得分:1)
将Guid
映射为keyword
type,并使用诸如term
query之类的词级查询来查找完全匹配。
答案 1 :(得分:1)
我迟到了,但您可以像这个示例一样使用 MatchPhrase Methode:
await _elasticClient.SearchAsync<Employee>(
s => s.Index(IndexName).Query(
q => q.MatchPhrase(tq =>
tq.Field(x => x.DepartmentId).Query(dep.Id.ToString())))