Elasticsearch 5.1:对“更像这样”的查询应用其他过滤器

时间:2016-12-21 21:35:39

标签: elasticsearch

在电子邮件之上构建搜索引擎。 MLT非常擅长查找具有相似机构或主题的电子邮件,但有时我想做的事情是:向我展示与此内容具有相似内容的电子邮件,但仅限于joe@yahoo.com且仅在此日期范围内。 ES 2.x似乎已经可以实现这一点,但似乎5.x不允许在除了考虑相似性之外的字段上进行过滤。我错过了什么吗?

我仍然无法想象如何做我所描述的。想象一下,为了简单起见,我有两种类型的电子邮件索引:bodysender。我现在知道要查找仅限发件人的邮件,发布的查询将类似于:

{
    "query": {
        "bool": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "sender": "mike@foo.com"
                            }
                        }
                    ]
                }
            }
        }
    }
}

同样,如果我想知道如何使用正文内容查找类似于单个英雄消息的消息,我可以发出如下查询:

{
    "query": {
    "more_like_this": {
            "fields" : ["body"],
            "like" : [{
              "_index" : "foo",
              "_type" : "email",
              "_id" : "a1af33b9c3dd436dabc1b7f66746cc8f"
            }],
            "min_doc_freq" : 2,
            "min_word_length" : 2,
            "max_query_terms" : 12,
            "include" : "true"
        }
    }
}

这两个查询都通过在根对象的query子句中添加子句来指定结果。但是,我尝试将这些放在一起的任何方式都给出了解析异常。我找不到任何文件的例子,可以说,给我一些类似于这个英雄的电子邮件,但只能来自mike@foo.com

1 个答案:

答案 0 :(得分:0)

您几乎就在那里,您可以使用bool/filter这样的filter查询将它们组合在一起,即从{ "query": { "bool": { "filter": [ { "term": { "sender": "mike@foo.com" } }, { "more_like_this": { "fields": [ "body" ], "like": [ { "_index": "foo", "_type": "email", "_id": "a1af33b9c3dd436dabc1b7f66746cc8f" } ], "min_doc_freq": 2, "min_word_length": 2, "max_query_terms": 12, "include": "true" } } ] } } } 中创建一个数组并将两个约束放在那里:

lt