Elasticsearch 通过使用倒排索引、文本分析和分布式搜索功能来实现全文搜索。其核心在于,Elasticsearch 依赖于 Apache Lucene 来创建倒排索引,倒排索引将术语(单个单词或标记)映射到包含它们的文档。对文档进行索引时,其文本字段会由分析器处理,分析器将文本分解为标记,对它们进行标准化(例如,转为小写),并过滤掉停用词等噪声。例如,“The quick brown fox” 这句话可能会被标记化为 ["quick", "brown", “fox”],每个术语都链接到文档 ID。这种倒排索引结构允许高效查找,因为搜索“brown”会立即检索到包含该术语的所有文档。
Elasticsearch 中的查询使用与索引相同的分析步骤进行处理,确保一致性。当用户搜索“brown fox”时,查询会被标记化和标准化,然后与倒排索引进行匹配。Elasticsearch 使用 BM25 等算法对结果进行评分,这些算法考虑词频和文档长度来对相关性进行排序。例如,一个同时包含“brown”和“fox”多次的文档得分会高于只包含一次的文档。分布式搜索通过将索引拆分为分片来处理,从而实现跨节点的并行查询执行。搜索请求会被路由到相关分片,这些分片返回部分结果,这些结果会聚合成最终的排序列表。这种可伸缩性使得 Elasticsearch 能够高效处理大型数据集。
Elasticsearch 通过可定制的分析器和丰富的查询 DSL 提供灵活性。开发人员可以定义具有特定分词器(例如,按空格拆分)和过滤器(例如,将“running”词干化为“run”)的分析器。自定义分析器可以包含同义词,允许“car”匹配“automobile”。REST API 简化了交互:通过 POST /my_index/_doc { "text": "..." }
索引文档,并通过 GET /my_index/_search
和 JSON 查询进行搜索。模糊匹配(quik~
匹配“quick”)和高亮显示(在结果中显示匹配的术语)等功能增强了搜索可用性。与 SQL 的 LIKE
不同,后者执行精确的子串匹配,Elasticsearch 的全文搜索理解语言细微差别,这使其在文本密集型应用中更快、更具相关性。