如何使用 NEST 与 ElasticSearch 进行 guid 匹配

Tho*_*mas 4 elasticsearch nest

我有 ES 文档,其中一个字段是一个 guid。

\n\n

当我尝试进行匹配时,破折号会严重破坏我的搜索,并且我会得到一堆不相关的部分匹配项。

\n\n

由于该字段是一个 guid,因此它始终需要精确匹配。

\n\n

在 Kibana 中,我可以将 guid 用引号引起来,并且得到精确匹配;对于 NEST,引号 don\xe2\x80\x99t 没有帮助。我也尝试过逃避破折号,但没有成功。

\n\n

我需要按原样存储 guid,因为在某些情况下我必须检索完整的 guid 文档,因此我可以\xe2\x80\x99t 删除其中的破折号。

\n\n

有没有办法用 NEST 标记该字段,以便当我查询时只返回完全匹配的内容?

\n\n
\n\n

编辑:\n根据下面的答案,这就是我所做的:

\n\n
    \n
  • 我将 [Nest.Keyword] 添加到 guid 字段

  • \n
  • 我这样查询:

    \n\n
    var R = await _ElasticClient.SearchAsync<PictureObject>(Sr => Sr\n    .Query(Q => Q.Term(Te => Te\n    .Field(F => F.AlbumId)   <- the guid field\n    .Value(IdString));  <- my value\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

但这不会返回任何内容。

\n\n

弹性站点的文档给出了一个示例(https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/terms-query-usage.html):

\n\n
q\n.Terms(c => c\n.Name("named_query")\n.Boost(1.1)\n.Field(p => p.Description)\n.Terms("term1", "term2")\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我找不到任何有关Name方法的文档,对于单个字段,我所做的似乎很相似,所以我不知道它对我的情况有什么影响(如果有的话)。

\n\n

从 Kibana 看到的我的领域的映射是:

\n\n
 "mapping": {\n    "pictureobject": {\n      "properties": {\n        "AlbumId": {\n          "type": "text",\n          "fields": {\n            "keyword": {\n              "type": "keyword",\n              "ignore_above": 256\n            }\n          }\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n

,

\n

Rus*_*Cam 9

将 映射Guidkeyword类型并使用术语级别查询(例如term查询)来查找精确匹配。

var r = await _ElasticClient.SearchAsync<PictureObject>(sr => sr
    .Query(q => q
        .Term(te => te
            .Field(f => f.AlbumId.Suffix("keyword"))
            .Value(IdString)
        )
    )
); 
Run Code Online (Sandbox Code Playgroud)