Elasticsearch中如何提取查询命中的匹配分词Token
Elasticsearch提取查询命中匹配分词的实现方案
你可以直接通过以下两种方案拿到命中的匹配分词,不需要额外做全字段分词遍历:
方案1:高亮返回值提取(优先推荐,无侵入)
不需要修改现有索引mapping、不需要重建索引,只需要在原有查询DSL中增加highlight配置,ES会自动将命中的分词用自定义标签包裹,直接解析标签内容即可得到匹配词,默认分词器会自动完成大小写归一处理。
修改后的查询DSL
{ "query": { "match_phrase_prefix": { "name": { "query": "lio", "slop": 3 } } }, "highlight": { "fields": { "name": {} }, "pre_tags": ["<match_tag>"], "post_tags": ["</match_tag>"] } }
返回结果示例
每个命中文档会新增highlight字段,格式如下:
"highlight": { "name": [ "<match_tag>lionel</match_tag> messi", "<match_tag>Lionel</match_tag> Jr" ] }
你只需要通过正则提取<match_tag>和</match_tag>中间的内容,再做去重、统一转小写处理,就能得到你期望的结果:[lionel]。
方案2:term_vector精准获取(适合高频分词分析场景)
如果你需要直接拿到结构化的分词匹配结果,不需要解析字符串,可以给字段开启term_vector配置,不过该方案需要重建索引。
索引mapping配置示例
PUT /players { "mappings": { "properties": { "id": {"type": "integer"}, "name": { "type": "text", "term_vector": "with_positions_offsets" }, "description": {"type": "text"} } } }
配置完成后,你可以在查询时配合explain参数,或者调用_termvectors接口,直接拿到命中的分词项、偏移量、匹配权重等结构化数据,不需要做字符串解析。
内容的提问来源于stack exchange,提问作者sim
相关产品推荐
相关产品推荐

