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 [性能优化必看]](