目录
倒排索引 (Inverted Index)
示例
分词器 (Analyzer)
评分机制 (Scoring)
查询执行
match 查询
match_phrase 查询
全文搜索是Elasticsearch的核心功能之一,它通过复杂的算法和数据结构来提供高效的搜索能力。为了深入理解其工作原理,我们需要探讨几个关键概念:倒排索引、分词器、评分机制以及查询的执行过程。
倒排索引 (Inverted Index)
倒排索引是全文搜索引擎的基础。与传统的正向索引(记录每个文档中包含哪些词)不同,倒排索引记录的是每个词出现在哪些文档中。这样当用户输入一个搜索请求时,系统可以快速定位到所有含有这些词的文档。
示例
假设有一个小型数据库,包含两篇新闻文章:
- 文章1: 人工智能正在改变世界。
- 文章2: 未来的世界将由智能机器主导。
倒排索引可能看起来像这样:
{
"人工智能": [1],
"正在": [1],
"改变": [1],
"世界": [1, 2],
"未来": [2],
"将": [2],
"由": [2],
"智能": [2],
"机器": [2],
"主导": [2]
}
分词器 (Analyzer)
在创建倒排索引之前,Elasticsearch会使用分词器对文本进行处理。分词器负责将文本分解成单个词语,并且可能会应用如小写转换、停用词移除等操作。不同的语言和地区通常需要不同的分词策略。
例如,在中文环境中,可能使用ik
分词器或smartcn
分词器来正确地分割中文句子。
评分机制 (Scoring)
Elasticsearch使用TF-IDF(Term Frequency - Inverse Document Frequency)和其他因素来计算每个文档的相关性得分。TF-IDF反映了某个词在特定文档中的重要程度及其在整个文集中的普遍性。此外,还可以考虑诸如短语匹配度、字段权重等因素。
查询执行
当你发起一个查询时,Elasticsearch会解析这个查询并生成一个内部表示形式,然后根据这个表示形式去查找倒排索引,最后返回结果。
match
查询
match
查询会对输入的文本进行同样的分析过程,就像在索引过程中一样。这确保了查询条件能够准确对应到已有的词汇表上。
GET /news/_search
{
"query": {
"match": {
"content": "人工智能"
}
}
}
match_phrase
查询
match_phrase
查询用于精确匹配短语,同时允许通过slop
参数控制短语内词之间的距离。
GET /news/_search
{
"query": {
"match_phrase": {
"content": {
"query": "人工智能",
"slop": 2 // 允许最多两个其他单词插在这两个词之间
}
}
}
}
这里的slop
值为2意味着“人工智能”这两个词可以在文中相隔不超过两个其他词的情况下仍被视为匹配。