Elasticsearch 5.2 剧集编号视频标题搜索技术咨询
嘿,这里完全是讨论这类Elasticsearch搜索问题的合适平台,不用找别的渠道啦!针对你提到的带剧集编号的视频搜索需求——比如用户搜“Four Beautyful Sun Flower 1”或者“Episode 15”时能精准定位对应剧集,结合ES 5.2的特性,我给你整理几个实用的解决方案:
1. 新增专属字段存储剧集编号
最直接有效的方式是给文档新增一个**episode_number整型字段**,专门提取并存储标题里的剧集数字(比如把“Episode 01”转换成1,“Episode 15”转换成15)。这样能实现精准的数值匹配,避免分词带来的干扰。
修改后的示例文档:
{"id": "1","title": "Four Beautyful Sun Flower - Episode 01", "episode_number": 1} {"id": "2","title": "Four Beautyful Sun Flower - Episode 15", "episode_number": 15}
之后用户搜索时,你可以先从搜索词里提取数字(比如用正则匹配\d+),再直接针对episode_number做term查询,精准命中对应剧集。
2. 自定义分析器优化标题字段的分词
ES 5.2支持自定义字符过滤器和分析器,我们可以通过pattern_replace过滤器把剧集编号做特殊处理,让分词器更精准地识别剧集标识。
比如创建一个包含剧集处理逻辑的自定义索引:
{ "settings": { "analysis": { "char_filter": { "episode_normalizer": { "type": "pattern_replace", "pattern": "Episode (\\d+)", "replacement": "Episode $1 EP$1" } }, "analyzer": { "title_episode_analyzer": { "type": "custom", "char_filter": ["html_strip", "episode_normalizer"], "tokenizer": "standard", "filter": ["lowercase", "asciifolding"] } } } }, "mappings": { "video": { "properties": { "title": { "type": "text", "analyzer": "title_episode_analyzer", "fields": { "keyword": { "type": "keyword" } } }, "episode_number": { "type": "integer" } } } } }
这个配置会把标题里的“Episode 01”转换成“Episode 01 EP01”,这样用户搜索“EP1”“01”这类变体时,也能匹配到对应的文档。
3. 多字段联合查询提升匹配精度
当用户输入搜索词时,我们可以同时查询title字段和episode_number字段,用bool查询组合两种匹配逻辑,既保证标题的相关性,又补充剧集编号的精准匹配:
{ "query": { "bool": { "should": [ { "match": { "title": { "query": "Four Beautyful Sun Flower 1", "boost": 2 } } }, { "term": { "episode_number": 1 } } ] } } }
给title字段设置更高的boost值,确保标题匹配度高的结果排在前面,同时用episode_number的精准匹配兜底,避免漏判。
4. 同义词处理提升搜索容错性
如果用户习惯用“Ep”代替“Episode”这类缩写,你可以给自定义分析器加上同义词过滤器,统一处理这类变体:
在索引的analysis.filter里新增:
"synonym_episode": { "type": "synonym", "synonyms": ["ep, episode"] }
然后把这个过滤器加到title_episode_analyzer的filter列表里,这样用户搜“Ep 1”也能匹配到“Episode 01”的视频。
另外提醒下:ES 5.2是比较早期的版本了,虽然以上方案都能正常运行,但如果后续有版本升级计划,新版本的ES(比如7.x及以上)有更灵活的文本处理能力(比如正则分词、动态模板等),可以进一步优化搜索体验。
内容的提问来源于stack exchange,提问作者Hoàng Phúc Lương

