flowpack / searchplugin
内容节点搜索集成插件
Requires
- neos/content-repository: ^4.0 || ^5.0 || ^7.0 || ^8.0 || dev-master
- neos/content-repository-search: ^4.0 || dev-master
- neos/eel: ^5.0 || ^6.0 || ^7.0 || ^8.0 || dev-master
- neos/flow: ^5.0 || ^6.0 || ^7.0 || ^8.0 || dev-master
- neos/fusion: ^4.0 || ^5.0 || ^7.0 || ^8.0 || dev-master
- neos/neos: ^4.0 || ^5.0 || ^7.0 || ^8.0 || dev-master
Suggests
- flowpack/elasticsearch-contentrepositoryadaptor: Provides search using Elasticsearch
- flowpack/simplesearch-contentrepositoryadaptor: A simple php search engine based on sqlite
Conflicts
README
本插件是一个搜索插件,与以下插件一起使用:
安装
使用composer与您喜欢的适配器安装
ElasticSearch
composer require flowpack/searchplugin flowpack/elasticsearch-contentrepositoryadaptor
SimpleSearch
composer require flowpack/searchplugin flowpack/simplesearch-contentrepositoryadaptor
从Flow 4.0开始,不再需要将此包的路由包含到您的主 Configuration/Routes.yaml
中。
配置
自定义索引名称
通常,为项目指定一个自定义索引名称是一个好主意,而不是默认的 typo3cr
。这样,在多个项目使用同一Elasticsearch服务器时,就不会出现冲突。
要指定自定义索引名称,需要以下内容
Neos:
ContentRepository:
Search:
elasticSearch:
indexName: acmecom
分页
可以通过Fusion配置分页搜索结果。以下显示默认值
prototype(Flowpack.SearchPlugin:Search).configuration {
itemsPerPage = 25
insertAbove = false
insertBelow = true
maximumNumberOfLinks = 10
}
自定义结果渲染
结果列表使用类型为 nodeType + 'SearchResult'
的Fusion对象进行渲染,对于每个命中项都可以轻松调整渲染,例如对于假设的 Acme.AcmeCom:Product
节点类型
prototype(Acme.AcmeCom:ProductSearchResult) < prototype(Neos.Neos:DocumentSearchResult) {
templatePath = 'resource://Acme.AcmeCom/Private/Templates/SearchResult/ProductSearchResult.html'
}
请随意使用Flowpack.SearchPlugin中的 DocumentSearchResult.html
作为示例。
搜索补全和建议
默认搜索表单模板带有指向此包的 SuggestController
的 data-autocomplete-source
属性。
要使用此术语建议器,需要按如下方式配置索引,以定义要使用的自定义分析器
Flowpack:
ElasticSearch:
indexes:
default: # client name used to connect (see Flowpack.ElasticSearch.clients)
acmecom: # your (custom) index name
settings:
analysis:
filter:
autocompleteFilter:
max_shingle_size: 5
min_shingle_size: 2
type: 'shingle'
analyzer:
autocomplete:
filter: [ 'lowercase', 'autocompleteFilter' ]
char_filter: [ 'html_strip' ]
type: 'custom'
tokenizer: 'standard'
然后需要配置要包含在建议构建中的节点类型,这可以这样完成
'Neos.Neos:Document':
superTypes:
'Flowpack.SearchPlugin:SuggestableMixin': true
'Flowpack.SearchPlugin:AutocompletableMixin': true
'Neos.Neos:Shortcut':
superTypes:
'Flowpack.SearchPlugin:SuggestableMixin': false
'Flowpack.SearchPlugin:AutocompletableMixin': false
'Neos.NodeTypes:TitleMixin':
superTypes:
'Flowpack.SearchPlugin:SuggestableMixin': true
'Flowpack.SearchPlugin:AutocompletableMixin': true
通过通过 GET
请求通过 term
参数提供,SuggestController
将返回来自Elasticsearch的JSON编码建议数组。它们使用来自 _all
字段的术语建议器获取,即“全文索引”。
可以使用这些内容使用您选择的JS库在搜索输入中提供自动完成。如果您需要自己构建建议控制器的URI,此表单使用的是以下内容
{f:uri.action(action: 'index', controller: 'Suggest', package: 'Flowpack.SearchPlugin', format: 'json', absolute: 1, arguments: {contextNodeIdentifier: node.identifier, dimensionCombination: dimensionCombination})}
调整建议上下文
建议上下文确定是否在建议中显示结果。默认情况下,隐藏的节点将被排除。在许多项目中,搜索还考虑了 Neos.Seo metaRobotsNoindex 属性或排除了某些节点类型。为了调整建议上下文以符合您的搜索逻辑,您可以编写自己的自定义逻辑,并通过Objects.yaml切换 Flowpack\SearchPlugin\Suggestion\SuggestionContextInterface
的实现
为建议创建URI
要创建有效链接,可以使用以下包
将此包提供的示例与自定义Fusion对象连接
pathToProtoType = Your.Vendor:Content.NodeLink
最后,将新属性添加到插件设置中
Flowpack:
SearchPlugin:
searchAsYouType:
suggestions:
sourceFields:
- title
- __myProperty
AJAX搜索
默认情况下,插件包含一个可以通过以下方式访问的控制器,使用 GET
{f:uri.action(action: 'search', controller: 'AjaxSearch', package: 'Flowpack.SearchPlugin', arguments: {node: node, q: ''}, absolute: 1)}
它期望将搜索词作为名为 q
的参数(如 AjaxSearch.fusion
中定义的那样)进行传递。这个控制器渲染搜索结果,并以HTML格式返回,不包含任何页面模板。因此,它可以用于通过AJAX请求搜索结果,并在需要时将其添加到DOM中。
从搜索词中移除特殊字符
建议从搜索词中移除Elasticsearch中保留的字符,以防止错误。在提交搜索之前,可以使用eel辅助程序将它们替换,如下所示
prototype(Flowpack.SearchPlugin:Search) {
searchTerm = ${Flowpack.SearchPlugin.SearchTerm.sanitize(request.arguments.search)}
}
请注意,如果您希望支持通配符(*
)和短语搜索("search exactly this"
),这将阻止用户显式使用这些功能。