如何使用NEST

时间:2018-12-04 20:14:37

标签: elasticsearch nest

我有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
            }
          }
        }

2 个答案:

答案 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())))