先说结论

倒排索引建立“词项到文档”的映射。查询时先找到词项,再读取包含该词项的文档列表,因此适合全文搜索,而不需要逐条扫描原始文本。

分析过程

文本字段写入时经过 analyzer:字符过滤器预处理文本,tokenizer 切分词元,token filter 再进行小写化、停用词处理或词干化。查询使用的分析器应与索引设计相匹配。

text 与 keyword

text 字段会分词,适合全文搜索;keyword 保留完整值,适合精确过滤、排序和聚合。常见 mapping 会为一个字段同时配置 text 和 keyword 子字段。

{
  "title": {
    "type": "text",
    "fields": { "keyword": { "type": "keyword" } }
  }
}

分片与副本

索引由主分片组成,副本提供高可用和额外读取能力。主分片数量创建后不容易直接改变,过多小分片会增加集群元数据、文件句柄和合并压力。

near real-time

新写入的数据经过 refresh 后才对搜索可见,所以 Elasticsearch 是近实时搜索。频繁 refresh 会增加段创建和合并成本,应根据业务延迟要求设置。

参考资料

写入为什么是近实时

文档写入内存缓冲后,经过 Refresh 生成可搜索的新 Segment,因此写成功与搜索可见之间有短暂间隔。Flush 主要涉及持久化提交点,Merge 负责合并小 Segment,三者不能混为一谈。

常见问题

追问 1:term 为什么可能查不到 text 原文?

text 已被分析成多个词项,而 term 不分析输入。全文搜索使用 match,精确匹配使用 keyword + term

追问 2:Refresh 越频繁越好吗?

不是。频繁 Refresh 降低可见延迟,但会产生更多小 Segment,增加合并与资源开销。

追问 3:删除后磁盘会立刻释放吗?

通常不会。不可变 Segment 先记录删除标记,实际空间在后续 Merge 重写文件时回收。