alleyinteractive / es-wp-query
Elasticsearch Wrapper for WP_Query
This package is auto-updated.
Last update: 2024-09-10 14:57:32 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()
通知。
- 如果您尝试使用正则表达式查询,ES_WP_Query将抛出
- LIKE比较与MySQL不兼容。在ES_WP_Query中,LIKE比较元查询将对分析过的元值运行一个
match
查询。这会类似于关键字搜索,并且通常比MySQL中的LIKE查询更有用。然而,与MySQL实现存在显著差异,ES_WP_Query很可能产生不同的搜索结果,因此不要期望它能直接替换。
关于WP_Query过滤器的说明
由于这个库从大多数情况下去除了MySQL,典型的WP_Query过滤器(如posts_where
、posts_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实现添加一个适配器。
- 您需要创建一个名为
es.php
的文件并将其添加到tests/
目录中。 es.php
可以简单地加载一个用于测试设置的包含适配器。否则,您需要进行一些额外的设置。- 如果您不使用提供的适配器
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
,以获取示例。