Elasticsearch 分析(Analysis)是 Elasticsearch 全文搜索功能的核心组成部分,它负责将文本数据转换成可搜索的索引项。分析过程中涉及文本的预处理、分词、过滤、标记化等步骤,使得用户能够有效地对文本内容进行查询、筛选和聚合。以下是在 Elasticsearch 中进行文本分析的实战指南:
1. 定义分析器
分析器由一个或多个分析组件组成,如字符过滤器(Character Filters)、分词器(Tokenizer)和词语过滤器(Token Filters)。创建或更新索引时,可以在映射中为特定字段指定所需的分析器。
请求格式:
PUT /<index_name>
{
"settings": {
"analysis": {
"analyzer": {
"<analyzer_name>": {
"type": "<analyzer_type>",
"char_filter": [ "<char_filter1>", "<char_filter2>" ],
"tokenizer": "<tokenizer_name>",
"filter": [ "<token_filter1>", "<token_filter2>" ]
}
},
"tokenizer": {
"<tokenizer_name>": {
"<tokenizer_config>"
}
},
"char_filter": {
"<char_filter_name>": {
"<char_filter_config>"
}
},
"filter": {
"<token_filter_name>": {
"<token_filter_config>"
}
}
}
},
"mappings": {
"properties": {
"<field_name>": {
"type": "text",
"analyzer": "<analyzer_name>"
}
}
}
}
示例:
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"
}
}
}
}
2. 内置分析器
Elasticsearch 提供了一系列内置分析器,可以直接使用或作为自定义分析器的基础:
-
Standard Analyzer: 默认的全文分析器,适用于大多数西方语言。它移除停用词、标点符号,并将文本分割成单词。
-
Simple Analyzer: 只做简单的分词,将文本按照非字母数字字符切割。
-
Whitespace Analyzer: 仅基于空格进行分词。
-
Stop Analyzer: 基于空格分词,并移除英文停用词。
-
Keyword Analyzer: 整个字段作为一个单一标记,不进行分词。
-
Language-Specific Analyzers: 如
english
,french
,spanish
等,针对特定语言优化的分析器。
3. 字符过滤器
字符过滤器在分词之前对文本进行预处理,如去除HTML标签、转义特殊字符等。
-
HTML Strip Character Filter: 移除HTML标签。
-
Mapping Character Filter: 替换字符或字符串。
-
Pattern Replace Character Filter: 使用正则表达式替换文本。
4. 分词器
分词器负责将文本分解成词汇单元(tokens)。
-
Standard Tokenizer: 默认的分词器,基于Unicode文本分割算法。
-
Letter Tokenizer: 只保留字母,忽略数字和符号。
-
Whitespace Tokenizer: 仅基于空格进行分词。
-
N-gram Tokenizer: 创建n-gram词汇单元,如双词、三词组合。
5. 词语过滤器
词语过滤器对分词后的词汇单元进行进一步处理,如大小写转换、词形还原、同义词扩展等。
-
Lowercase Token Filter: 将词汇单元转为小写。
-
Stop Words Token Filter: 移除停用词。
-
Stemmer Token Filter: 进行词形还原,如英语的 Porter Stemming。
-
Synonym Token Filter: 处理同义词。
6. 测试分析器
使用 _analyze
API 可以测试分析器对给定文本的处理效果,查看分词结果。
请求格式:
POST /<index_name>/_analyze
{
"analyzer": "<analyzer_name>",
"text": "<your_text>"
}
示例:
POST /my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "This is a sample text with HTML tags: <strong>Hello World!</strong>"
}
7. 使用 Java Client 管理分析器
Java 开发者可以使用官方提供的 Java High Level REST Client 或 Java Low Level REST Client 来操作分析器。以下是一个使用 High Level REST Client 测试分析器的示例:
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.AnalyzeRequest;
import org.elasticsearch.client.core.AnalyzeResponse;
public class TestAnalyzerExample {
public static void main(String[] args) throws Exception {
RestHighLevelClient client = // 初始化客户端实例...
AnalyzeRequest request = new AnalyzeRequest("my_index", "my_custom_analyzer", "This is a sample text with HTML tags: <strong>Hello World!</strong>");
AnalyzeResponse analyzeResponse = client.indices().analyze(request, RequestOptions.DEFAULT);
for (AnalyzeResponse.AnalyzeToken token : analyzeResponse.getTokens()) {
System.out.println(token.getTerm() + " (" + token.getPosition() + ", " + token.getStartOffset() + ", " + token.getEndOffset() + ")");
}
}
}
通过上述实战指南,您可以了解如何在 Elasticsearch 中定义、使用和测试分析器,以满足特定文本数据的索引和搜索需求。实际应用中,请根据具体语料特点和搜索要求,选择或定制合适的分析器配置。