在 Elasticsearch 的查询 DSL 中使用“MatchPhrasePrefix”
Using `MatchPhrasePrefix` in query DSL of Elasticsearch
我是 Elasticsearch 新手。
谁能解释一下为什么要搜索 (NEST 6
):
var searchResponse1 = this.elasticClient.Search<dynamic>(
s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
.Query(q => q.Bool(b => b.Must(m => m.SimpleQueryString(c => c.Query("query"))))));
正确生成以下请求(我使用 Fiddler 获得此请求):
POST https://someUrl.com/_search?pretty=true&error_trace=true&typed_keys=true&ignore_unavailable=true HTTP/1.1
{
"from": 0,
"query": {
"bool": {
"must": [
{
"simple_query_string": {
"query": "query"
}
}
]
}
},
"size": 100
}
但以下两个搜索 'MatchPhrasePrefix':
var searchResponse2 = this.elasticClient.Search<dynamic>(
s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
.Query(q => q.Bool(b => b.Must(m => m.MatchPhrasePrefix(c => c.Query("query"))))));
var searchResponse3 = this.elasticClient.Search<dynamic>(
s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
.Query(q => q.MatchPhrasePrefix(p => p.Query("query"))));
结果:
POST https://someUrl.com/_search?pretty=true&error_trace=true&typed_keys=true&ignore_unavailable=true HTTP/1.1
{
"from": 0,
"size": 100
}
我在这里错过了什么?
MatchPhrasePrefix
查询 还必须 指定要定位的字段。例如
var searchResponse2 = client.Search<dynamic>(s => s
.AllTypes()
.AllIndices()
.IgnoreUnavailable()
.Size(100)
.From(0)
.Query(q => q
.Bool(b => b
.Must(m => m
.MatchPhrasePrefix(c => c
.Field("some_field") // <-- target the "some_field" field
.Query("query")
)
)
)
)
);
查询结果
POST /_search
{
"from": 0,
"query": {
"bool": {
"must": [
{
"match_phrase_prefix": {
"some_field": {
"query": "query"
}
}
}
]
}
},
"size": 100
}
如果不指定字段,则查询在客户端中被视为无条件,并将从响应中省略。有 an issue 讨论是否应在下一个主要版本中删除 conditionless 查询。
我是 Elasticsearch 新手。
谁能解释一下为什么要搜索 (NEST 6
):
var searchResponse1 = this.elasticClient.Search<dynamic>(
s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
.Query(q => q.Bool(b => b.Must(m => m.SimpleQueryString(c => c.Query("query"))))));
正确生成以下请求(我使用 Fiddler 获得此请求):
POST https://someUrl.com/_search?pretty=true&error_trace=true&typed_keys=true&ignore_unavailable=true HTTP/1.1
{
"from": 0,
"query": {
"bool": {
"must": [
{
"simple_query_string": {
"query": "query"
}
}
]
}
},
"size": 100
}
但以下两个搜索 'MatchPhrasePrefix':
var searchResponse2 = this.elasticClient.Search<dynamic>(
s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
.Query(q => q.Bool(b => b.Must(m => m.MatchPhrasePrefix(c => c.Query("query"))))));
var searchResponse3 = this.elasticClient.Search<dynamic>(
s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
.Query(q => q.MatchPhrasePrefix(p => p.Query("query"))));
结果:
POST https://someUrl.com/_search?pretty=true&error_trace=true&typed_keys=true&ignore_unavailable=true HTTP/1.1
{
"from": 0,
"size": 100
}
我在这里错过了什么?
MatchPhrasePrefix
查询 还必须 指定要定位的字段。例如
var searchResponse2 = client.Search<dynamic>(s => s
.AllTypes()
.AllIndices()
.IgnoreUnavailable()
.Size(100)
.From(0)
.Query(q => q
.Bool(b => b
.Must(m => m
.MatchPhrasePrefix(c => c
.Field("some_field") // <-- target the "some_field" field
.Query("query")
)
)
)
)
);
查询结果
POST /_search
{
"from": 0,
"query": {
"bool": {
"must": [
{
"match_phrase_prefix": {
"some_field": {
"query": "query"
}
}
}
]
}
},
"size": 100
}
如果不指定字段,则查询在客户端中被视为无条件,并将从响应中省略。有 an issue 讨论是否应在下一个主要版本中删除 conditionless 查询。