kaliop / ezfindsearchenginebundle
Kaliop eZFind-Search-Engine Bundle
Requires
- php: >=5.6
- ezsystems/ezfind-ls: *
- ezsystems/ezpublish-kernel: >=5.4|>=2014.11
Requires (Dev)
- codeclimate/php-test-reporter: ~0.4
- kaliop/ezmigrationbundle: ~4.0 || ~5.0
- phpunit/phpunit: ~4.0 || ~5.0
This package is auto-updated.
Last update: 2024-09-21 02:19:27 UTC
README
本包引入了对遗留的eZFind搜索引擎的包装,使开发人员可以使用与eZ Publish 5中默认可用的相同搜索API。
功能
- 通过简单地更改使用的一个服务名称,将现有的基于数据库的内容搜索与基于solr的搜索交换
- 支持大多数来自eZPublish内核的查询条件和排序子句
- 允许从搜索中获取eZ5内容对象或原始solr数据(以eZFind解码和SOLR原生格式均可)
- 允许按分数排序
- 支持分面
- 允许对查询条件和排序子句使用自定义的SOLR语法
- 与SolrSearchEngineBundle不同,不接管所有现有的内容搜索
- 针对执行速度和内存使用进行优化(在不摧毁eZFind的情况下尽可能多)
设置
安装
您可以使用Composer安装此包
composer require kaliop/ezfindsearchenginebundle
然后在其内核中启用它。
配置
默认情况下,该包已完全配置。以下是可用参数的完整列表及示例值
ezfind_search_engine.search_settings.boost_functions: - 'recip(ms(NOW/HOUR,attr_publication_date_dt),4e-12,1000,2)' # default list of fields returned when *not* returning Contents ezfind_search_engine.search_settings.fields_to_return: - meta_name_t - meta_owner_name_t - meta_path_string_ms - meta_priority_si - meta_score_value:score # Score field needs to be renamed as it won't be passed from eZFind # in case you want to use an alternative 'legacy fetch function' to power the search service. The default is ezfind/search ezfind_search_engine.search_settings.legacy_function_handler.module_name: 'ezfind' ezfind_search_engine.search_settings.legacy_function_handler.function_name: 'search'
使用
使用此包的最简单方法是简单地交换您用于现有查询的搜索服务
...
对于更高级的功能,您可以交换查询对象与更具体的类之一。这允许您设置更多的查询参数,例如,通过禁用不需要的功能来加速查询的执行
...
分面
目前,该包实现了以下FacetBuilders
use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder; use Kaliop\EzFindSearchEngineBundle\API\Repository\Values\Content\Query\FacetBuilder as KaliopFacetBuilder; $now = new DateTime(); $yearAgo = new DateTime(); $yearAgo->modify('-1 year'); $query->facetBuilders = [ // Kaliop Facet Builders new KaliopFacetBuilder\FieldRangeFacetBuilder([ 'name' => 'Numeric field range facet', 'fieldPath' => 'product/price', 'start' => 100, 'end' => 500, 'gap' => 50, 'limit' => 8, ]), new KaliopFacetBuilder\DateRangeFacetBuilder([ 'name' => 'Date range facet', 'fieldPath' => 'article/publication_date', 'start' => $yearAgo, 'end' => $now, 'gap' => new DateInterval('P1M'), 'limit' => 12, ]), // Base eZ Facet Builders new FacetBuilder\FieldFacetBuilder([ 'name' => 'Simple field facet', 'fieldPaths' => 'article/title', 'limit' => 20, ]), new FacetBuilder\FieldFacetBuilder([ 'name' => 'Object relation(s) facet', 'fieldPaths' => 'article/author/id', 'limit' => 20, ]), new FacetBuilder\ContentTypeFacetBuilder([ 'name' => 'Content type facet', ]), new FacetBuilder\CriterionFacetBuilder([ 'name' => 'Criterion facet', 'filter' => new Criterion\Field('article/title', Criterion\Operator::CONTAINS, 'new'), ]), ];
扩展包
标记服务/标准
该包利用一系列'处理器'将搜索查询转换为要发送到Solr的遗留搜索配置。
您可以使用标记服务添加更多自定义处理器,以下标签
ezfind_search_engine.content.criterion_handler.filter
这些将转换要添加到eZFind调用"过滤器"部分的准则(或在按分数排序时转换为查询字符串)
ezfind_search_engine.content.sort_clause_handler
这些将转换排序子句
故障排除
...
常见问题解答
-
“位置搜索”是否在当前包中实现?答:鉴于eZFind使用的SOLR模式,除非您根本不使用具有多个位置的内容,否则无法可靠地实现“位置搜索”。对此表示歉意。
-
此包与从eZPublish 5以来可用的'SolrSearchEngineBundle'有何区别?答1:此包使用与ezfind相同的SOLR模式。因此,它与遗留内核100%兼容。答2:此包不接管来自eZPublish存储库的标准搜索服务。由开发人员决定将哪些查询发送到数据库,哪些发送到SOLR。
-
为什么我看到所有结果都有相同的
score
?答:当您不按分数排序结果时,该包通过使用纯'过滤器查询'来优化性能(这应该很好,因为Solr缓存过滤器)。这意味着所有搜索命中都获得相同的分数。 -
使用
$query->filter
和$query->query
有什么区别吗?答:如果您不是按得分排序结果,则没有区别。当您按得分排序结果时,为了获得最佳性能,应使用$query->query
对所有影响评分的准则(例如搜索词)进行排序,并使用$query->filter
对所有其他准则(例如内容类型限制、部分限制等)进行排序。 -
我在命令行脚本中尝试使用新的搜索服务,但总是返回无结果。答:在命令行脚本中启动 eZPublish 旧版内核的方式存在一个错误。我们提供了一种替代实现,可以通过编辑服务来激活。
谢谢
特别感谢 SOkamoto(是他让这一切开始)、CRevillo、DClements、MIwaniak、SKlimaszewski