如何为SearchKick添加自定义Token Filter并使其生效?
解决方案
你当前的配置已经把自定义过滤器关联到了索引分析器上,但要让搜索阶段也生效,同时保留Searchkick默认设置,需要按以下步骤调整:
1. 确保搜索阶段使用对应分析器
Searchkick默认会复用索引时的分析器处理搜索文本,但为了明确性(或应对特殊场景),可以在字段映射里显式指定search_analyzer,让搜索和索引使用相同的分析逻辑:
mappings: { properties: { name: { type: 'text', analyzer: 'custom_index', search_analyzer: 'custom_index' # 搜索时也用该分析器 }, alternate_names: { type: 'text', analyzer: 'custom_index', search_analyzer: 'custom_index' }, description: { type: 'text', analyzer: 'searchkick_word_start_index', search_analyzer: 'searchkick_word_start_index' }, }, }
2. 正确保留默认设置的方式
直接覆盖settings会替换掉Searchkick的默认配置,要保留默认项同时新增自定义过滤器,需用merge扩展默认配置:
searchkick( settings: -> { Searchkick.default_settings.merge( analysis: { filter: { replace_mm: { type: 'pattern_replace', pattern: '(\d)mm', replacement: '$1 mm ', }, replace_x_1: { type: 'pattern_replace', pattern: '(\d) ?(×|x)', replacement: '$1 x ', }, replace_x_2: { type: 'pattern_replace', pattern: '(×|x) ?(\d)', replacement: ' x $2', }, searchkick_edge_ngram: { type: 'edge_ngram', min_gram: 1, max_gram: 50 }, }, analyzer: { custom_index: { type: 'custom', tokenizer: 'standard', filter: [ 'replace_mm', 'replace_x_1', 'replace_x_2', 'lowercase', 'asciifolding', 'searchkick_edge_ngram', ], }, searchkick_word_start_index: { type: 'custom', tokenizer: 'standard', filter: [ 'lowercase', 'asciifolding', 'searchkick_edge_ngram', ], }, }, } )}, mappings: -> { Searchkick.default_mappings.merge( properties: { name: { type: 'text', analyzer: 'custom_index', search_analyzer: 'custom_index' }, alternate_names: { type: 'text', analyzer: 'custom_index', search_analyzer: 'custom_index' }, description: { type: 'text', analyzer: 'searchkick_word_start_index', search_analyzer: 'searchkick_word_start_index' }, } )}, highlight: [:name], search_synonyms: [] )
3. 重新索引生效配置
修改配置后必须重新索引数据,才能让新的分析器和过滤器作用到现有数据上:
Model.reindex
4. 验证过滤器是否正常工作
用Searchkick的客户端工具测试分析效果,确认过滤器是否生效:
Model.searchkick_client.analyze( index: Model.searchkick_index.name, analyzer: 'custom_index', text: '5mm 3×4' )
返回的tokens中应该出现5 mm、3 x、4这类处理后的结果,说明过滤器已正常运行。
内容的提问来源于stack exchange,提问作者Tallboy
相关产品推荐
相关产品推荐

