ElasticSearch 实战: ES 分析 ( Analysis )

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 中定义、使用和测试分析器,以满足特定文本数据的索引和搜索需求。实际应用中,请根据具体语料特点和搜索要求,选择或定制合适的分析器配置。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值