Elastic Search域名精确搜索异常问题咨询
Elasticsearch精确匹配域名问题的解决方案
问题原因
你的valor_dominio_propio字段应为text类型,且使用了默认的standard分词器。该分词器会将域名catalogonuevo1.com拆分为catalogonuevo1和com两个独立词条存入倒排索引,导致:
- 使用
term查询catalogonuevo1时,刚好匹配拆分后的单个词条,因此能命中目标文档; - 使用
term查询完整域名catalogonuevo1.com时,索引中无对应完整词条,所以返回空结果; - 使用
match查询时,搜索词会被同样分词,只要文档包含任意一个拆分后的词条就会被匹配,因此catalogonuevo2.com因包含com也会被命中,无法实现精确搜索。
解决方案
方案一:利用keyword子字段查询
text类型字段默认会生成一个.keyword子字段(若未生成需手动添加映射),该字段以完整字符串作为词条存储,不会分词。直接用term查询该子字段即可实现精确匹配:
[ { "query": { "bool": { "filter": [ { "term": { "valor_dominio_propio.keyword": "catalogonuevo1.com" } } ] } }, "from": 0, "size": 1 } ]
方案二:修改字段映射为keyword类型
若该字段仅需精确匹配,无需分词搜索,可直接将字段类型改为keyword:
PUT /你的索引名/_mapping { "properties": { "valor_dominio_propio": { "type": "keyword" } } }
修改映射后需重新索引数据,之后使用原term查询完整域名即可正常命中,且match查询也会自动转为精确匹配。
方案三:使用match_phrase查询(保留text类型时可选)
若必须保留text类型,可使用match_phrase查询,要求搜索词的分词结果按顺序完整匹配文档内容:
[ { "query": { "bool": { "filter": [ { "match_phrase": { "valor_dominio_propio": "catalogonuevo1.com" } } ] } }, "from": 0, "size": 1 } ]
此方式依赖分词结果的顺序,性能和精确性略逊于前两种方案,仅作为备选。
内容的提问来源于stack exchange,提问作者Felipe Castillo
相关产品推荐
相关产品推荐

