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
本文发布于:2024-02-04 05:11:18,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170699830152360.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |