alleyinteractive/es-wp-query

Elasticsearch Wrapper for WP_Query

安装: 317

依赖: 0

建议者: 0

安全: 0

星级: 123

关注者: 68

分支: 28

开放问题: 20

类型:wordpress-plugin

0.5.1 2024-09-04 16:34 UTC

README

Elasticsearch Wrapper for WP_Query

WP_Query的替代品,利用Elasticsearch进行复杂查询。

警告!

此插件目前处于beta开发阶段,因此没有任何部分是保证的。它工作(单元测试证明了这一点),但我们不会关心向后兼容性,直到第一个版本发布。如果您选择使用此插件,请密切关注提交日志,以确保我们不会破坏您实现的内容。

使用说明

这实际上更像是一个库,而不是插件。因此,它与连接到Elasticsearch的方式无关。因此,它生成Elasticsearch DSL,但不会实际连接到Elasticsearch服务器来执行这些查询。它也不会对数据进行索引,不会添加映射等。如果您需要Elasticsearch WordPress插件,我们还提供了一个免费的开源选项,名为SearchPress

一旦您设置了Elasticsearch插件并索引了您的数据,您需要告诉这个库如何使用它。如果您正在使用的实现包含一个适配器,您可以像这样加载它

es_wp_query_load_adapter( 'adapter-name' );

如果您的Elasticsearch实现没有包含适配器,您需要创建一个名为ES_WP_Query的类,该类扩展了ES_WP_Query_Wrapper。该类至少应有一个名为query_es()的方法,该方法在Elasticsearch服务器上执行查询。以下是一个示例

class ES_WP_Query extends ES_WP_Query_Wrapper {
	protected function query_es( $es_args ) {
		return wp_remote_post( 'http://localhost:9200/wordpress/post/_search', array( 'body' => json_encode( $es_args ) ) );
	}
}

请参阅包含的适配器以获取示例和灵感。

一旦设置了适配器,您可以使用两种方式使用此库。

使用此库的第一种(也是首选)方式是实例化ES_WP_Query而不是WP_Query。例如

$q = new ES_WP_Query( array( 'post_type' => 'event', 'posts_per_page' => 20 ) );

这将保证您的查询将使用Elasticsearch运行(假设请求可以使用并应该使用Elasticsearch),并且您应该不会与主题或插件发生冲突。结果对象(本例中的$q)在外部如何获取帖子方面与WP_Query的工作方式相同。

使用此库的第二种方式是在您的WP_Query参数中添加'es' => true。以下是一个示例

$q = new WP_Query( array( 'post_type' => 'event', 'posts_per_page' => 20, 'es' => true ) );

从一方面来看,这是一种更安全的使用此库的方式,因为如果库丢失,它将回退到旧的WP_Query。然而,因为它依赖于WP_Query的正常处理,所以插件或主题可能会创建冲突,其中该插件或主题尝试通过其提供的过滤器之一修改WP_Query(以下提供更多详细信息)。在这方面,这可以是一个非常不安全的使用此库的方式。

无论您使用哪种方式使用库,对象的其他方面都应按常规工作。

与WP_Query的差异和不受支持的功能

元查询

  • 不支持正则表达式比较。与PHP相比,Elasticsearch中的正则表达式语法略有不同,因此即使我们尝试支持它们,也可能会导致许多意外的行为。此外,正则表达式在Elasticsearch中非常消耗资源,因此您可能最好使用WP_Query进行这些查询。
    • 如果您尝试使用正则表达式查询,ES_WP_Query将抛出_doing_it_wrong()通知。
  • LIKE比较与MySQL不兼容。在ES_WP_Query中,LIKE比较元查询将对分析过的元值运行一个match查询。这会类似于关键字搜索,并且通常比MySQL中的LIKE查询更有用。然而,与MySQL实现存在显著差异,ES_WP_Query很可能产生不同的搜索结果,因此不要期望它能直接替换。

关于WP_Query过滤器的说明

由于这个库从大多数情况下去除了MySQL,典型的WP_Query过滤器(如posts_whereposts_join等)变得不相关或在某些极端情况下会产生冲突。

使用WP_Query( 'es=true' )时发生的情况的要点是,在pre_get_posts上,查询变量被发送到一个新的ES_WP_Query实例。然后,查询变量被替换为使用Elasticsearch找到的ID的简单post__in查询。由于生成的SQL查询比查询变量所暗示的要简单得多,插件或主题可能会尝试修改SQL并破坏它。

注意,在“使用WP_Query'es' => true”列中,“无问题”和“N/A”并不保证。例如,在几乎每个过滤器中,WP_Query对象都是通过引用传递的。如果插件或主题修改了该对象,可能会产生冲突。这里的“无问题”和“N/A”假设过滤器是按照预期使用的。最后,一切取决于pre_get_posts。如果一个插件或主题在优先级>1000时挂钩,可能会导致一切潜在冲突。

贡献

欢迎并感谢对这个插件的任何帮助!

错误

如果您发现错误,请检查当前问题,如果您的错误没有列出,请提交一个新问题。如果您想修复您发现的错误,请在开始之前在问题中说明(以防我们对该错误有其他计划,我们不希望您浪费时间)。

功能请求

此插件的范围非常有限;它应该尽可能覆盖WP_Query,而不仅仅是这个范围。如果您认为这个范围内缺少某些内容,或者您认为其中某些部分可以改进,我们非常乐意听到您的意见

单元测试

使用phpunit包含了单元测试。为了运行测试,您需要为您的Elasticsearch实现添加一个适配器。

  1. 您需要创建一个名为es.php的文件并将其添加到tests/目录中。
  2. es.php可以简单地加载一个用于测试设置的包含适配器。否则,您需要进行一些额外的设置。
  3. 如果您不使用提供的适配器
    • es.php需要包含或包含一个名为es_wp_query_index_test_data()的函数。此函数在添加数据时被调用,给您一个索引它的机会。您应该强制Elasticsearch在索引后刷新,以确保数据可以立即搜索。
      • 注意:即使刷新,我注意到可能<0.1%的时间,测试可能没有原因失败,我认为这与有关。如果您偶尔和意外地失败,您应该重新运行它以进行双重检查。
    • es.php还必须包含或包含一个名为ES_WP_Query的类,该类扩展了ES_WP_Query_Wrapper。该类至少应包含一个名为protected function query_es( $es_args )的方法,该方法查询您的Elasticsearch服务器。
    • 此文件还可以包含您需要的一切其他内容,以确保一切正常工作,例如调整字段映射。
    • 请参阅所包含的适配器,特别是 travis.php,以获取示例。