The requested URL was not found on this server. 不管你信不信,反正我是没找到

post_filter在es内部的执行流程是怎样的,它是怎么实现基于query的结果做二次筛选的

Elasticsearch | 作者 shuanglong | 发布于2022年05月27日 | 阅读数:1494

1.全文检索,filter语句执行通过tip文件以及tim文件找到docId,生成bitMap,有结果cache,各filter进行btmap交并集计算。
官网的文档post_filter位于search result这里,那post_filter也会像filter这样执行吗?如果是好像就没有必要存在,如果不是,那它是怎么来进行filter后的结果进行二次筛选的呢?
已邀请:

WiseLi1998 - 菜狗一只

赞同来自:

现在采用这样的写法doc['agreement.expiration_date']获取到的数据始终为空列表
 
GET dwd_cr_supplier_business_view1/_search
{
"_source": ["*"],
"query": {
"bool": {
"filter": [
{
"script": {
"script": {
"source": """
long max_expiration_date = -2209017960L;
long max_is_long_trem = 0;
String newColumnName= "agreement."+params.columnName;
Debug.explain(doc['agreement.value'].value);
Debug.explain(doc[newColumnName]);
for (int i = 0; i < doc['agreement.expiration_date'].length; i++) {
//Debug.explain(params.columnIn.contains((Integer)doc[newColumnName][i]));
//数据边界内
if(params.columnIn.contains((Integer)doc[newColumnName][i])){
Debug.explain(doc['agreement.creator_id']);
Debug.explain(doc['agreement.creator_id'][i]);
Debug.explain(doc['agreement.creator_id'][i]);
//若是仅自己
if(params.onlySelf){
if(doc['agreement.creator_id'][i] == params.creatorId)
{
if(max_expiration_date<doc['agreement.expiration_date'][i])
{
max_expiration_date = doc['agreement.expiration_date'][i]
}
if(max_is_long_trem<doc['agreement.is_long_term'][i])
{
max_is_long_trem = doc['agreement.is_long_term'][i]
}
}
}
}
}
Debug.explain(max_is_long_trem);
if(max_is_long_trem==params.isLongTerm)
{
return true;
}else{
if (max_expiration_date >= params.expirationDateStart
&& max_expiration_date < params.expirationDateEnd){
return true;
}
return false;
}
""",
"lang": "painless",
"params": {
"columnName": "dept_id",
"columnIn": [
12555
],
"onlySelf": true,
"creatorId": 695,
"isLongTerm": 1,
"expirationDateStart": 1830096000,
"expirationDateEnd": 1830182400
}
}
}
},
{
"term": {
"supplier_code.keyword": "LYZBKS0173869"
}
}
]
}
}
}

要回复问题请先登录注册