christymcgrory/es-wp-query

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

安装: 82

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 28

类型:wordpress-plugin

1.0.0 2019-12-16 11:50 UTC

This package is auto-updated.

Last update: 2024-09-24 22:32:56 UTC


README

WP_Query的Elasticsearch包装器

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( 'https://: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,以获取示例。