spatie / elasticsearch-search-string-parser
基于查询字符串构建Elasticsearch查询
Requires
- php: ^8.0
- elasticsearch/elasticsearch: ^7.12
- illuminate/collections: ^8.40|^9.0|^10.0
- spatie/elasticsearch-query-builder: ^1.0
Requires (Dev)
- brianium/paratest: ^6.2
- larapack/dd: ^1.1
- phpunit/phpunit: ^9.3|^10.0
- spatie/phpunit-snapshot-assertions: ^4.2
- vimeo/psalm: ^4.4
README
解析自定义搜索字符串并在ElasticSearch中执行
此包允许您将类似于 foo bar status:active @john.doe
的搜索字符串转换为对应的ElasticSearch请求。可以使用正则表达式和 spatie/elasticsearch-query-builder
添加自定义 指令(如 status:active
和 @john.doe
)。同时,也提供了对分组指令(例如 group_by:project
)的基本支持,并为某些指令提供自动完成建议。
use Elasticsearch\ClientBuilder; use Spatie\ElasticsearchStringParser\SearchQuery; $subjects = SearchQuery::forClient(ClientBuilder::create()) ->baseDirective(new SubjectBaseDirective()) ->patternDirectives( new CompanyDirective(), new UserDirective(), ) ->search('deadly neurotoxin company:aperture @glados');
在上面的示例中,使用适当的参数执行ElasticSearch请求,以搜索给定公司(aperture
)、用户(glados
)和主题字符串(deadly neurotoxin
)的结果。返回的值是一个包含搜索结果和应用于指令的建议的 \Spatie\ElasticsearchStringParser\SearchResults
对象。
支持我们
我们在创建 顶级开源包 上投入了大量的资源。您可以通过 购买我们的付费产品之一 来支持我们。
我们非常感激您从家乡寄给我们明信片,并说明您正在使用我们的哪些包。您可以在 我们的联系页面 上找到我们的地址。我们将所有收到的明信片发布在 我们的虚拟明信片墙上。
安装
您可以通过composer安装此包
composer require spatie/elasticsearch-search-string-parser
工作原理:指令
在创建搜索字符串解析器时,您通过定义 指令 来决定如何解析搜索字符串的每一部分。当在搜索字符串中找到指令时,它将应用于底层的ElasticSearch。指令可以用于添加基本匹配查询,也可以用于添加排序、聚合、分面等...
让我们通过剖析一个示例搜索字符串及其解析器来深入了解该包的内部工作原理。
$searchString = 'cheap neurotoxin company:aperture deadly @glados'; SearchQuery::forClient(ClientBuilder::create()) ->baseDirective(new SubjectBaseDirective()) ->patternDirectives( new CompanyDirective(), new UserDirective(), )->search($searchString);
搜索字符串解析器可以有多个 PatternDirective
,但最多只能有一个 BaseDirective
。在示例搜索字符串中,有两个模式指令:company:aperture
和 @glados
。这些将由 CompanyDirective
和 UserDirective
解析。剩余的字符串(cheap nearotoxin deadly
)将由基本指令处理。
为此,我们将遍历所有配置的模式指令。每个模式指令都有一个要查找的正则表达式。如果其中一个指令在搜索字符串中找到匹配项,它将被应用,并将匹配项从搜索字符串中删除。然后,对该匹配项或下一个模式指令重复此过程。
回到我们的示例:CompanyDirective
配置为匹配 company:(.*)
。在示例字符串中,此正则表达式模式将匹配 company:aperture
。这意味着 CompanyDirective
将被应用,并将添加查询 company_name="aperture"
到ElasticSearch构建器中。最后,指令将从搜索字符串中删除,留下以下字符串
cheap neurotoxin deadly @glados
由于没有其他与CompanyDirective
匹配的结果,我们将寻找下一个UserDirective
。用户指令将搜索@(.*)
并因此匹配@glados
。现在UserDirective
将应用其查询到ElasticSearch构建器并移除匹配字符串。我们得到以下内容
cheap neurotoxin deadly
没有剩余的模式指令可以应用。然后将整个剩余字符串传递给SubjectBaseDirective
。该基本指令将决定如何处理剩余的搜索字符串,例如,在主题字段上进行模糊搜索。
用法
$elasticsearch-search-string-parser = new Spatie\ElasticsearchStringParser(); echo $elasticsearch-search-string-parser->echoPhrase('Hello, Spatie!');
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
有关报告安全漏洞的详细信息,请查看我们的安全策略。
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。