同一个关键词,term 查询返回 0 条,match 查询返回 200 条。字段是 text,写入时用的是 ik_max_word,_mapping 里也没有 keyword 子字段。日志里能对上时间点,这种反而好排。

term 不走分析器,拿原字符串去倒排表里精确匹配。索引里存的是「苹果」「手机」两个词条,整串「苹果手机」根本不在词条表里。match 会先分词再逐个查,所以能命中。这一点先确认清楚,后面就不用反复试。

GET products/_analyze
{"field": "title", "text": "苹果手机"}
GET products/_search
{"query": {"term": {"title.keyword": "苹果手机"}}}

「term 查询被分词」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。

处理上按这个顺序:精确匹配改用 keyword 子字段 比如 title.keyword;需要中文整串匹配时 单独建 keyword 字段存原值;确认 term 的值大小写和写入时一致 keyword 区分大小写;调试时用 _analyze 看写入侧切成了什么。

结果对不对很好判断,term 查 title.keyword 的条数和 match 一致,_analyze 的 token 与预期相符。

作者 9823189