过滤 DSL 查询搜索 - Elasticsearch
Filtering DSL Query Search - Elasticsearch
我阅读了一些关于查询上下文和筛选上下文的文章和文档,了解到如果您不需要进行全文搜索或评分无关紧要,最好使用筛选上下文。 在我的例子中,我想要 return 包含 ID 的日志...所以我意识到我应该只使用过滤器上下文而不是查询上下文。除了全文搜索或评分之外,是否有一个硬性基线来定义何时应该使用一个而不是另一个?
所以我从原来的 DSL 查询搜索 cmd:
GET /customer-simulation-es-app-logs*/_search
{
"query": {
"match": {
"_id": "mJvG0nkBiU3wk_hrEd-8"
}
}
到过滤器上下文:
GET /customer-simulation-es-app-logs*/_search
{
"query": {
"bool": {
"filter": [
{"match": {"_id": "mJvG0nkBiU3wk_hrEd-8"}}
]
}
}
}
}
因为我想使用 NEST 来执行查询搜索,所以我采用了这种方法。
[HttpGet("GetAll/{_id}")]
public async Task<EsSource> GetAll(String _id)
{
var response = await _elasticClient.SearchAsync<EsSource>(s => s
.Index("customer-simulation-es-app-logs*")
.Query(q => q
.Bool(b => b
.Filter(f => f
.Match(m => m.Field("_id").Query(_id))))));
return response?.Documents?.FirstOrDefault();
}
这是使用 NEST 进行 filter context
的正确方法吗?
这将是发出仅具有筛选器上下文的查询的正确方法。一些可能有帮助的额外要点
- 一个term-level query on the
_id
field, like a term
query就足够了,因为不涉及分析链
- 如果您知道包含文档的索引,get API 将是更好的选择。尽管正在使用通配符索引模式,但暗示该索引可能未知。
- NEST 有 convenient operator overloads on queries to make writing bool queries more succinct。最终的查询可以更简洁地写成
var response = await _elasticClient.SearchAsync<EsSource>(s => s
.Index("customer-simulation-es-app-logs*")
.Query(q => +q
.Match(m => m
.Field("_id")
.Query(_id)
)
)
);
我阅读了一些关于查询上下文和筛选上下文的文章和文档,了解到如果您不需要进行全文搜索或评分无关紧要,最好使用筛选上下文。 在我的例子中,我想要 return 包含 ID 的日志...所以我意识到我应该只使用过滤器上下文而不是查询上下文。除了全文搜索或评分之外,是否有一个硬性基线来定义何时应该使用一个而不是另一个?
所以我从原来的 DSL 查询搜索 cmd:
GET /customer-simulation-es-app-logs*/_search
{
"query": {
"match": {
"_id": "mJvG0nkBiU3wk_hrEd-8"
}
}
到过滤器上下文:
GET /customer-simulation-es-app-logs*/_search
{
"query": {
"bool": {
"filter": [
{"match": {"_id": "mJvG0nkBiU3wk_hrEd-8"}}
]
}
}
}
}
因为我想使用 NEST 来执行查询搜索,所以我采用了这种方法。
[HttpGet("GetAll/{_id}")]
public async Task<EsSource> GetAll(String _id)
{
var response = await _elasticClient.SearchAsync<EsSource>(s => s
.Index("customer-simulation-es-app-logs*")
.Query(q => q
.Bool(b => b
.Filter(f => f
.Match(m => m.Field("_id").Query(_id))))));
return response?.Documents?.FirstOrDefault();
}
这是使用 NEST 进行 filter context
的正确方法吗?
这将是发出仅具有筛选器上下文的查询的正确方法。一些可能有帮助的额外要点
- 一个term-level query on the
_id
field, like aterm
query就足够了,因为不涉及分析链 - 如果您知道包含文档的索引,get API 将是更好的选择。尽管正在使用通配符索引模式,但暗示该索引可能未知。
- NEST 有 convenient operator overloads on queries to make writing bool queries more succinct。最终的查询可以更简洁地写成
var response = await _elasticClient.SearchAsync<EsSource>(s => s
.Index("customer-simulation-es-app-logs*")
.Query(q => +q
.Match(m => m
.Field("_id")
.Query(_id)
)
)
);