组合范围并必须在elasticsearch

时间:2016-02-12 13:16:08

标签: php elasticsearch filter range

我在使用ElasticSearch时遇到了一些问题。我是新手,所以这很正常。 我的需要是在我的网站上配置搜索。我有一些视频,并有一些过滤器,以减少显示的结果。 我有完全匹配的过滤器,但也有范围过滤器。

所以我的问题是根据用户搜索的内容将搜索关键字与这些过滤器结合起来。

到目前为止,我已将搜索到的关键字与范围过滤器结合使用,但如果设置了完全匹配过滤器,我根本不知道如何操作。

以下是参数如何进入Elasticsearch:

[body] => Array
        (
            [query] => Array
                (
                    [filtered] => Array
                        (
                            [query] => Array
                                (
                                    [multi_match] => Array
                                        (
                                            [query] => messi
                                            [fields] => Array
                                                (
                                                    [0] => title
                                                    [1] => duration
                                                    [2] => id_category
                                                    [3] => id_tag
                                                )

                                            [fuzziness] => 0.5
                                        )

                                )

                            [filter] => Array
                                (
                                    [range] => Array
                                        (
                                            [duration] => Array
                                                (
                                                    [gte] => 0
                                                    [lte] => 300
                                                )

                                        )

                                )

                        )

                )

        )

如果我有过滤器只向我显示视频,在某些类别中匹配关键字“messi”的持续时间介于0到300秒之间,应该怎么样?

劝告!

1 个答案:

答案 0 :(得分:0)

查看Bool Query。我建议你将多重匹配查询放在必须部分,并将过滤器移动到(非常明显的)过滤器部分。因此,ES将根据多重匹配计算相关性分数,但将其与过滤器的可缓存性相结合。一个简短的例子:

<?php

$query = [
    'body' => [
        'query' => [
            'bool' => [
                'must' => [
                    [
                        'multi_match' => []
                    ],
                    ...
                ],
                'filter' => [
                    [
                        'range' => []
                    ],
                    ...
                ]
            ]
        ]
    ]
];