NEST Fluent DSL查询一些URL字段

时间:2016-09-07 10:06:15

标签: elasticsearch nest

有一些与NEST有关的问题。以下是我ES中的一些文件。

enter image description here

如您所见,我已在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)
                        );

我已经尝试过编码网址,但仍然找不到任何内容。有什么想法吗?

更新:我使用'匹配'解决了这个问题。

.Query(q =>
    //q.Term(p => p.CallPoint, "abcdefg")
    q.MatchPhrasePrefix(c=> c.Field(d=> d.CallPoint).Query("/cloudconnect/api/xxxxxxx/v1"))
)

1 个答案:

答案 0 :(得分:2)

我怀疑callPoint是已分析的string字段,已由标准分析器进行分析。通过查看callPoint索引中的映射,您将能够看到20160806的映射方式。使用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不会对查询输入进行分析,因此会尝试将查询输入与反向索引中的内容进行匹配,对于callPoint字段,已在索引时进行分析。 A match query会对查询输入进行分析,以便您按预期获得文档的匹配项。或者,您可以将callPoint映射为not_analyzed字符串字段,以便在索引时不对输入进行分析并逐字索引。