【问题标题】:filter by child frequency in ElasticSearch在 ElasticSearch 中按子频率过滤
【发布时间】:2013-10-18 16:46:15
【问题描述】:

我目前在弹性搜索(文档)和与这些文档相关的孩子(cmets)中索引了父母。 我的第一个目标是根据子查询搜索包含 N 个以上 cmets 的文档。这是我的做法:

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
                    }
                }
            }
        }
    }
}

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

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 过滤每个子查询。

有解决这个问题的办法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 但是 bool 查询不允许我写一个像 (condition A AND (condition B OR condition C)) 这样的句子,例如。
    • 如果您使用多个嵌套的布尔查询,当然可以。外部的将有两个 must 子句,conditionA 和一个额外的 bool 查询,只有带有 conditionB 和 conditionC 的 should 子句。说得通?这只是一种不同的心态,但您可以实现相同的行为。
    • 其实你是对的,bool查询可以做逻辑...请问如何单独过滤分数?
    • 我看到你在邮件列表中得到了答案,最初是从我自己那里得到的,后来也是从克林顿那里得到的。如果你不介意,我会去那里。 groups.google.com/forum/?fromgroups=#!topic/elasticsearch/…
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2013-01-08
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多