query与filter的合并
将filter的api列为deprecated,然后合并到query里头。之后查询的context就分为query的context和filter的context。凡是不是filter的context就走query的context。filter的话,其结果不参与score计算,而且会缓存,可能相对快一些。
判断是否属于filter context
the constant_score query
the must_not and (newly added) filter parameter in the bool query
the filter and filters parameters in the function_score query
any API called filter, such as the post_filter search parameter, or in aggregations or index aliases
deprecated的方式
{
"query": {
"filtered": {
"filter": {
"term": {
"year": 1961
}
}
}
}
}
合并后的方式
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
bool的话,这种方式出来的score为0,如果加上个match_all的话,则score为1
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}
constant_score方式
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
constant_score的方式,默认score为1
match和term query的区别
matchQuery的机制是:先检查字段类型是否是analyzed,如果是,则先分词,再去去匹配token;如果不是,则直接去匹配token。
termQuery的机制是:直接去匹配token。
对于value中带-的特殊处理
比如
{
"query": {
"bool": {
"filter": {
"term": {
"status": "demo-active"
}
}
}
}
}
value带了-,则默认会被切词,导致搜索结果不准确。解决办法之一就是在字段那里加个.raw
{
"query": {
"bool": {
"filter": {
"term": {
"status.raw": "demo-active"
}
}
}
}
}
关于合并后的filter在java api中的使用
使用json最直接,省得再用java的api翻译一遍
String queryJson = "{\n" +
" \"query\": {\n" +
" \"constant_score\": {\n" +
" \"filter\": {\n" +
" \"term\": {\n" +
" \"status.raw\": \"demo-active\"\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
QueryBuilders.wrapperQuery(queryJson)
doc
[在elasticsearch里如何高效的使用filter [性能优化必看]](http://log.medcl.net/item/201...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。