查询某些 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
字符串字段,以便在索引时不分析输入,而是逐字索引。
有一些与 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
字符串字段,以便在索引时不分析输入,而是逐字索引。