在ElasticSearch中按子频率过滤

时间:2013-10-18 01:35:20

标签: elasticsearch aggregate-functions frequency-analysis elasticsearch-plugin

我目前的父母在弹性搜索(文件)和与这些文件相关的子(评论)中编入索引。 我的第一个目标是根据子查询搜索超过N条评论的文档。我是这样做的:

documents/document/_search
{
    "min_score": 0,
    "query": {
       "has_child" : {
            "type" : "comment",
            "score_type" : "sum",
            "boost": 1,
            "query" : {
               "range": {
                    "date": {
                        "lte": 20130204,
                        "gte": 20130201,
                        "boost": 1
                    }
                }
            }
        }
    }
}

我使用分数来计算文档的评论量,然后使用“min_score”按文件过滤文档。 现在,我的目标是不仅搜索评论,还搜索与文档相关的其他几个子文档,始终基于频率。类似于下面的查询:

documents/document/_search
{
    "query": {
        "match_all": {
        }
    },
    "filter" : {
        "and" : [{
            "query": {
                "has_child" : {
                    "type" : "comment",
                    "query" : {
                      "range": {
                        "date": {
                            "lte": 20130204,
                            "gte": 20130201
                        }
                      }
                    }
                }   
            }   
        },
        {
        "or" : [
            {"query": {
                "has_child" : {
                    "type" : "comment",
                        "query" : {
                          "match": {
                            "text": "Finally"
                        }
                    }
                }
                }
            },
            { "query": {
                "has_child" : {
                    "type" : "comment",
                        "query" : {
                          "match": {
                            "text": "several"
                        }
                    }
                }
                }  
            }
        ]
        }
    ]
    }
}

上面的查询工作正常,但它不会像第一个那样基于频率进行过滤。由于在计算分数之前计算过滤器,我不能使用min_score过滤每个子查询。

这个问题的任何解决方案?

1 个答案:

答案 0 :(得分:3)

根本没有与过滤器相关的分数。我建议将整个逻辑移到查询部分,并使用bool query将不同的查询组合在一起。