0

我有一个看起来像这样的文档索引:

{
    url: "/foo/bar",
    html_blocks: [
       "<h1>hi</h1>"
    ],
    tags: [
        "video",
        "text"
    ],
    title: "My title"
}

我想在titlehtml_blocks字段上查询这些文档,并且对于任何匹配项,如果它们具有video标签,则添加一个提升。

到目前为止,我的查询如下所示:

{
    "query": {
        "query_string": {
            "query": "foo",
            "fields": [
                "title",
                "html_blocks"
            ]
        }
    }
}

如何修改它,以便它仅在现有查询中找到匹配项时继续返回结果,但在任何具有视频标签的结果中添加提升?谢谢!

4

1 回答 1

3

你想要一个 custom_filters_score ,它只会增加匹配。请注意,过滤器输入不会被分析,因此如果需要分析,您可以将其包装在查询中。您的其他提升选项(虽然不是真正适用于这种情况)是提升查询,它有利于降级结果和 custom_score_query,它有利于基于一些计算值的添加提升。

请参阅:Custom_filters_score

{
    "query": {
        "custom_filters_score": {
            "query": {
                "query_string": {
                    "query": "foo",
                    "fields": [
                        "title",
                        "html_blocks"
                    ]
                }
            },
            "filters": [
                {
                    "filter": {
                        "term": {
                            "tags": "video"
                        }
                    },
                    "boost": 3
                }
            ]
        }
    }
}

编辑:

这就是我所说的使用过滤器查询包装查询的意思。相信我,一旦你掌握了 ES 的窍门,你就会被嵌套得如此之深,以至于你会产生一些有史以来最令人满意的查询。

{
    "query": {
        "custom_filters_score": {
            "query": {
                "query_string": {
                    "query": "foo",
                    "fields": [
                        "title",
                        "html_blocks"
                    ]
                }
            },
            "filters": [
                {
                    "filter": {
                        //here comes the filter query, and I changed term to match
                        //since match analyzes
                        "query":{                          
                            "match": {
                                "tags": "video"
                            }
                         }
                    },
                    "boost": 3
                }
            ]
        }
    }
}
于 2013-10-01T19:00:16.347 回答