如何在ElasticSearch中合并2个索引的结果?

时间:2016-08-15 18:20:57

标签: php elasticsearch lucene yii2

我在ElasticSearch中有 2个索引 documents_1documents_2,它们具有不同的映射类型(它们有一些不同的属性)。我在Yii2上使用php框架在网上搜索。

问题:如何搜索2个索引(如果可能)并将结果合并为一个按日期排序的例如?要解释我确实需要这样的东西:

$queryOne = DocumentOne::find()->all();
$queryTwo = DocumentTwo::find()->all();

merge_results($queryOne, $queryTwo);

DocumentOne.php

class DocumentOne extends \yii\elasticsearch\ActiveRecord
{
    public static function index()
    {
        return 'documents_1';
    }

    public static function type()
    {
        return 'type_a';
    }

    public function attributes()
    {
        return ['id', 'any_1', 'created_format_1'];
    }
}

DocumentTwo.php

class DocumentTwo extends \yii\elasticsearch\ActiveRecord
{
    public static function index()
    {
        return 'documents_2';
    }

    public static function type()
    {
        return 'type_b';
    }

    public function attributes()
    {
        return ['id', 'any_2', 'created_format_2'];
    }
}

DocumentOneSearch.php

class DocumentOneSearch extends DocumentOne
{
    public function search($params)
    {
        $query = DocumentOne::find();
        $sort = new Sort([
            'defaultOrder' => [
                'created_format_1' => SORT_DESC,
            ],
        ]);

        return $query
            ->orderBy($sort->orders)
            ->all();
    }
}

1 个答案:

答案 0 :(得分:0)

您是否考虑过以下内容:

function cmp($a, $b)
{
    return strcmp($a->date, $b->date);
}

$queryOne = DocumentOne::find()->all();
$queryTwo = DocumentTwo::find()->all();

$result = array_merge($queryOne, $queryTwo);

usort($result, "cmp");

假设您的文档有一个名为date的属性?

编辑:如果您只需要对第一组结果进行排序,那么您只需array_merge()结果