很多人学 Elasticsearch 时,只盯着 query,却忽视了 analyzer。这是最容易走偏的地方之一。
因为全文检索不是拿原句直接硬比,而是:
原始文本
│
▼
analyzer 分析
│
├── 字符过滤
├── 分词
├── 小写化
├── 停用词处理
└── 其他归一化
▼
词项(terms)
│
▼
写入倒排索引也就是说:
用户搜不到,很多时候不是 query 写错,而是文本在进入索引时就被拆错了。
看一个最小例子:
POST /_analyze
{
"analyzer": "standard",
"text": "Wireless Noise Cancelling Headphones"
}概念上你会得到接近这样的词项:
["wireless", "noise", "cancelling", "headphones"]这说明 standard analyzer 做了几件关键事:
- 识别词边界
- 去掉大部分标点影响
- 统一大小写
所以全文搜索真正比较的,不是整句字符串,而是这些被拆出来的词项。
这也是为什么下面两种字段要分清:
text:适合全文检索,值会被分析keyword:适合精确匹配、排序、聚合,值通常按原样保留
这条线千万别乱:
text -> 给“搜索句子/文章/标题”
keyword -> 给“品牌/状态/ID/标签/分类”