在Elasticsearch中提升具有特定标记的匹配文档

时间:2013-10-01 18:42:45

标签: search lucene elasticsearch

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

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

我想在标题 html_blocks 字段中查询这些文档,对于任何匹配,如果他们有视频,则添加提升标签。

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

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

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

1 个答案:

答案 0 :(得分: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
                }
            ]
        }
    }
}