Elasticsearch高亮结果缺失字符串问题求助(elasticsearch-dsl 7.4.0)
解决Elasticsearch高亮内容截断问题
使用elasticsearch-dsl 7.4.0实现文本字段特定词汇高亮时,遇到长文本(含!、/、-等特殊字符,长度超约100字符)末尾内容丢失的情况。例如:
- 原内容:
YOUR OFFICEKITCHEN - TASTING KITCHEN - SWEET CHILI HABANERO - GOURMET HANDMADE CRAFT MEAT SNACK - 1 POUND BAG - 高亮后内容:
YOUR OFFICEKITCHEN - TASTING KITCHEN - SWEET CHILI HABANERO - <em>GOURMET HAND</em><em>MA</em>DE CRAFT MEAT SNACK
当前高亮配置代码如下:
def search(self): highlight = { "fields": { "content": { "type": "plain", "number_of_fragments": 0, } } } s = super(FacetedCustomSearch, self).search() return s.extra(highlight=highlight)
以下是可行的解决方案:
- 显式设置
no_match_size参数,值设为字段可能的最大长度(比如1000,根据实际文本长度调整),确保完整返回整个字段内容:def search(self): highlight = { "fields": { "content": { "type": "plain", "number_of_fragments": 0, "no_match_size": 1000 # 按需调整为实际最大文本长度 } } } s = super(FacetedCustomSearch, self).search() return s.extra(highlight=highlight) - 检查
content字段的分词器配置,若分词器设置了max_token_length导致长文本被截断,需调大该参数,保证文本能被完整分词。 - 尝试切换高亮类型为
unified,它对长文本和特殊字符的兼容性更好:def search(self): highlight = { "fields": { "content": { "type": "unified", "number_of_fragments": 0, "no_match_size": 1000 } } } s = super(FacetedCustomSearch, self).search() return s.extra(highlight=highlight)
内容的提问来源于stack exchange,提问作者CemreY
相关产品推荐
相关产品推荐

