如何为单个待索引文档设置专属同义词及同位置双令牌?
索引阶段生成文档专属同义词令牌的实现方案
可行方案概述
完全可以通过自定义分析器搭配脚本化令牌过滤器,在索引时基于文档自身字段的动态条件,在同一位置生成两个(或多个)令牌,实现文档专属同义词的索引效果。
具体实现步骤
1. 创建包含脚本过滤器的自定义分析器
利用Elasticsearch的script_token_filter,在索引流程中读取文档的指定字段值,动态生成与原令牌位置、偏移量完全一致的同义词令牌。
示例配置:
PUT /my_index { "settings": { "analysis": { "analyzer": { "doc_specific_synonym_analyzer": { "tokenizer": "standard", "filter": [ "lowercase", "doc_specific_synonym_filter" ] } }, "filter": { "doc_specific_synonym_filter": { "type": "script", "script": { "source": """ List<Token> outputTokens = new ArrayList<>(); for (Token token : tokens) { // 保留原始令牌 outputTokens.add(token); // 从当前文档的doc_synonym字段获取专属同义词 String synonym = doc['doc_synonym'].value; if (synonym != null && !synonym.isBlank()) { // 创建与原令牌位置、偏移量一致的同义词令牌 Token synToken = new Token(synonym, token.startOffset, token.endOffset, token.position, token.positionLength); outputTokens.add(synToken); } } return outputTokens; """ } } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "doc_specific_synonym_analyzer" }, "doc_synonym": { "type": "keyword" } } } }
2. 验证效果
索引测试文档:
PUT /my_index/_doc/1 { "content": "documentSpecificTokenA", "doc_synonym": "documentSpecificTokenB" }
调用分析接口验证结果:
POST /my_index/_analyze { "analyzer": "doc_specific_synonym_analyzer", "text": "documentSpecificTokenA", "field": "content" }
返回的令牌结构将与你给出的示例一致:
0 - documentspecifictokena - 1 0 - documentspecifictokenb - 1
关键注意事项
- 确保Elasticsearch配置中
script.allowed_contexts包含indexing,允许脚本在索引阶段访问文档字段。 - 若需要多同义词映射,可将
doc_synonym字段设为数组类型,在脚本中循环遍历数组生成多个令牌。 - 该方案仅作用于索引阶段,搜索阶段可独立配置分析器,避免影响搜索逻辑。
内容的提问来源于stack exchange,提问作者Desperado
相关产品推荐
相关产品推荐

