跨单独的WordPress安装进行统一搜索

时间:2016-02-22 作者:José Tomás Tocino

我有许多(100多个)不同的WordPress安装在不同的服务器上,我需要有一个集中的搜索。。。发动机能够一次搜索所有网站。我没有运行WordPress Multisite,安装它不是一个选项。将所有站点移动到同一服务器也不是一种选择。

我一直在寻找解决方案,我遇到了这两种情况ElasticSearchApache Solr, 两者似乎都建立在Apache Lucene. 这两个系统似乎都有插件,但没有一个提到多网站搜索。

我该怎么设置?您是否有在多个WordPress安装中设置搜索的经验?

5 个回复
最合适的回答,由SO网友:José Tomás Tocino 整理而成

最后,我终于完成了我最初在问题中发布的内容。我已经建立了一个Elasticsearch 服务器使用Docker,我已经安装了Elasticpress 插件,它可以正确索引elasticsearch索引中的所有帖子和页面。

然后,我使用简单的bootstrap和jquery创建了一个简单的前端来在Elasticsearch中搜索,它的工作非常有魅力。

SO网友:Mark Kaplun

您应该将站点移动到同一服务器和同一数据库,然后您就可以运行任何查询。除此之外,我所知道的编写自己的搜索引擎的唯一选择就是使用谷歌的site search API 这使您可以访问原始数据,而不是谷歌通常显示的代码片段。最便宜的一层是100美元/年,这可能就是为什么你找不到很多插件的原因。

另一种选择是将DBs复制到另一台服务器(或具有搜索功能的站点所在的服务器),并在其上运行搜索。但即使这样,如果所有服务器至少都在本地网络中,以减少潜在的安全问题,效果也会更好。

SO网友:nonsensecreativity

我以前也做过类似的事情,我为我的客户创建了一个元搜索站点,它使用WordPress Rest API搜索我的所有客户站点。

这里是在不同服务器上使用多个站点搜索的一个小主意,这只是一个使用PHP的粗略示例。如果您使用WP站点本身作为搜索站点的中心,那么使用WP\\u remote\\u get功能将更加容易。

要求:

每个站点都安装了WP REST API v2插件http://v2.wp-api.org/

在要请求远程的站点上启用curl

以下是代码:

使用CURL设置API请求

function call_api( $url ) {
    $curl = curl_init();

    curl_setopt_array( $curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true
    ));

    $result = curl_exec($curl);
    curl_close($curl);
    return json_decode($result);
}
处理表单提交的搜索功能

function site_search( $sites, $search = \'\' ) {

    $results  = array();
    $api_url  = \'wp-json/wp/v2\';
    $types    = \'posts\';

    foreach( $sites as $site ) {
        $rest_url = "{$site}/{$api_url}/{$types}?search={$search}";

        $req = call_api( $rest_url );
        if( $req ) {
            $results = array_merge( $results, $req );
        }
    }

    return $results;
}
变量

 //The search keyword
 $search_key = isset( $_GET[\'search\'] ) ? $_GET[\'search\'] : \'\';
 //lists of the sites you want to search with v2 rest api enabled
 $sites = array(
            \'http://wordpress-site-with-v2-rest-api-enabled.com\',
            \'http://another-wp-site-with-v2-rest-api-enabled.com\',
        );
处理程序

$contents = array();
if( !empty( $search_key ) ) {
    $contents = site_search( $sites, $search_key );
}
HTML

<!DOCTYPE html>
<html>
<head>
    <title>Test WP REST API</title>
</head>
<body>
    <form method="GET">
        <input type="text" name="search" value="<?php echo ( isset( $_GET[\'search\'] ) ? $_GET[\'search\'] : \'\' ); ?>" />
        <input type="submit" value="SUBMIT" />
    </form>
    <?php foreach( $contents as $content ) : ?>

            <div class="content">
                <h2><a href="<?php echo $content->link; ?>"><?php echo $content->title->rendered; ?></a></h2>
                <?php echo $content->excerpt->rendered; ?>
            </div>

    <?php endforeach; ?>
</body>
</html>
这只是一个粗略的例子,您需要进行安全性等方面的工作。希望这能帮助您开始。

SO网友:dotancohen

Apache Solr可以处理多个DataImport Handlers. 我建议设置one handler for each MySQL database, 并在索引中添加一个额外的字段,以便数据来自哪个服务器,从而可以将slug与网站进行匹配。

Solr应该可以轻松地处理100个中等大小网站的导入,但您需要在SSD, not a spinning hard drive. 我强烈建议将Solr实例放在内存优化的Amazon AWS实例上,例如r3。2xlarge或更大。这将是一个公羊猪,特别是在最初的进口阶段。初始导入后,如果您发现站点更新不频繁,可以降低服务器类型。尽管如此,我仍然建议使用一个内存优化的AWS实例,因为Solr确实可以很好地处理它们。

SO网友:prosti

虽然这可能不是理想的解决方案,但这只是一个可以开始构建搜索的想法。它仍然在后面使用谷歌搜索引擎。您可能需要使用谷歌搜索引擎显示100个结果,并且您将使用以下网站限制您的搜索到特定网站:示例。com站点:示例2。com“然后您的搜索查询开始”。。因此,您需要创建查询Google的脚本,然后将结果返回给最终用户。

相关推荐

nothing happen in search form

我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &