在Elasticsearch 7.3中,倒排索引和分词器(Analyzer)是实现全文检索的核心技术。
倒排索引(Inverted Index)
倒排索引是Elasticsearch用来快速查找文档的一种数据结构。在传统的数据库中,正向索引是从文档ID查找文档内容;而在全文搜索引擎如Elasticsearch中,倒排索引则是将文档中的词汇映射回包含它们的文档列表。
具体来说,Elasticsearch为每个索引中的每个字段生成一个倒排索引。对于文本字段,这个过程分为两步:
- 分词:将文本字段分割成单独的词汇(术语)。
- 建立映射:为每个词汇创建一个列表,该列表包含了所有包含该词汇的文档ID和相关的位置信息(在文档中出现的位置)。
分词器(Analyzer)
分词器是Elasticsearch处理文本字段的核心组件,负责将文本转换为可以被索引和搜索的词汇单元。分词器通常包括以下几个步骤:
- 字符过滤器(Character Filters):预处理文本,如去除HTML标记、转义特殊字符等。
- 分词器(Tokenizer):将文本切分成一系列词汇或标记(tokens)。
- 词汇过滤器(Token Filters):进一步处理分词后的标记,如转换大小写、去停用词(如“的”、“得”、“和”等常见但无实际含义的词语)、同义词扩展等。
在Elasticsearch中,可以为每个字段指定不同的分析器,以适应不同语言和应用场景的需求。例如,对于英文文本可能使用标准分析器(Standard Analyzer),而对于中文文本则可能使用IK分词器或其他针对中文优化的分析器。
示例配置
下面是一个简单的映射配置示例,其中指定了一个字段使用标准分析器:
PUT my_index
{
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "standard"
}
}
}
}
在实际使用中,你还可以自定义分析器,比如创建一个针对英文的自定义分析器,包含特定的字符过滤器和词汇过滤器:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"char_filter": ["html_strip"],
"tokenizer": "standard",
"filter": ["lowercase", "asciifolding"]
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_custom_analyzer"
}
}
}
}
在这个自定义分析器中,首先移除了HTML标签,然后使用标准分词器进行分词,最后将词汇转换为小写并折叠非ASCII字符。这样,无论搜索哪种形式的词汇,都可以找到对应的文档。