查询某些 URL 字段的 NEST Fluent DSL

NEST Fluent DSL querying some URL field

有一些与 NEST 相关的问题。下面是我的ES里面的一些文档。

如您所见,我已经在我的 ES 中插入了一些条目。我试着做一些这样的查询:

        var response = elastic.Search<ESIntegrationLog>(s => s
                            .Index("20160806")
                            .Type("esintegrationlog")
                            .Query(q =>
                                q.Term(p => p.CalledBy, "lazada")
                            )
                            .Sort(ss => ss.Descending(p => p.CalledOn))
                            .Take(300)
                        );

结果如我所料,确实找到了条目。但是当我试图通过 'callPoint' 查询时,我不知何故找不到任何结果。下面是代码:

        var response = elastic.Search<ESIntegrationLog>(s => s
                            .Index("20160806")
                            .Type("esintegrationlog")
                            .Query(q =>
                                q.Term(p => p.CallPoint, "/cloudconnect/api/xxxxxxx/v1")
                            )
                            .Sort(ss => ss.Descending(p => p.CalledOn))
                            .Take(300)
                        );

我已经尝试对 URL 进行编码,但仍然没有找到任何东西。有什么想法吗?

更新:我使用 'match'.

解决了这个问题
.Query(q =>
    //q.Term(p => p.CallPoint, "abcdefg")
    q.MatchPhrasePrefix(c=> c.Field(d=> d.CallPoint).Query("/cloudconnect/api/xxxxxxx/v1"))
)

我怀疑callPoint是一个分析过的string字段,已经被标准分析器分析过了。通过查看 20160806 索引中的映射,您将能够了解 callPoint 是如何映射的。使用 Sense

GET 20160806

如果 callPoint 的映射是 { "type" : "string" } 那么输入将在索引时进行分析。您可以看到标准分析器如何使用 _analyze API

分析输入
POST _analyze
{
    "text" : "/cloudconnect/api/xxxxxxx/v1",
    "analyzer": "standard"
}

产生以下代币

{
   "tokens": [
      {
         "token": "cloudconnect",
         "start_offset": 1,
         "end_offset": 13,
         "type": "<ALPHANUM>",
         "position": 0
      },
      {
         "token": "api",
         "start_offset": 14,
         "end_offset": 17,
         "type": "<ALPHANUM>",
         "position": 1
      },
      {
         "token": "xxxxxxx",
         "start_offset": 18,
         "end_offset": 25,
         "type": "<ALPHANUM>",
         "position": 2
      },
      {
         "token": "v1",
         "start_offset": 26,
         "end_offset": 28,
         "type": "<ALPHANUM>",
         "position": 3
      }
   ]
}

A term query does not analyze the query input so will be attempting to match the query input as is against what is in the inverted index, which for the callPoint field, has been analyzed at index time. A match query 确实会分析查询输入,因此您会按预期获得文档的匹配项。或者,您可以将 callPoint 映射为 not_analyzed 字符串字段,以便在索引时不分析输入,而是逐字索引。