有一些与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)
);
我已经尝试过编码网址,但仍然找不到任何内容。有什么想法吗?
更新:我使用'匹配'解决了这个问题。
.Query(q =>
//q.Term(p => p.CallPoint, "abcdefg")
q.MatchPhrasePrefix(c=> c.Field(d=> d.CallPoint).Query("/cloudconnect/api/xxxxxxx/v1"))
)
答案 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
字符串字段,以便在索引时不对输入进行分析并逐字索引。