首页 > 解决方案 > ElasticSearch - 从标准词干分析器中排除特殊字符

问题描述

我正在为我的 ElasticSearch 索引使用标准分析器,我注意到当我在其中搜索查询时- 分析器将作为词干分析器步骤的一部分%删除(在查询“2% milk”上)%

GET index_name/_analyze 
{
  "field": "text.english",
  "text": "2% milk"
}

响应是以下 2 个标记(2milk):

{
  "tokens": [
    {
      "token": "2",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<NUM>",
      "position": 0
    },
    {
      "token": "milk",
      "start_offset": 3,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

意思是,2%变成2

我想使用标准词干分析器来减少标点符号,我不想使用空格词干分析器或其他不标准的词干分析器,但我确实想<number>%在索引中使用符号作为术语。

有没有办法将词干分析器配置为在数字旁边忽略特殊字符?最坏的情况根本不忽略它?

谢谢!

标签: elasticsearch

解决方案


您可以通过使用字符过滤器配置自定义分析器来实现所需的行为,该过滤器可防止“%”字符被剥离。

查看有关内置分析器配置的 Elasticsearch 文档,以将该配置用作配置自定义分析器的蓝图(请参阅 Elasticsearch 参考:英语分析器

添加一个字符过滤器,将百分比字符映射到不同的字符串,如以下代码片段所示:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_percent_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_percent_char_filter": {
          "type": "mapping",
          "mappings": [
            "0% => 0_percent",
            "1% => 1_percent",
            "2% => 2_percent",
            "3% => 3_percent",
            "4% => 4_percent",
            "5% => 5_percent",
            "6% => 6_percent",
            "7% => 7_percent",
            "8% => 8_percent",
            "9% => 9_percent"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "The fee is between 0.93% or 2%"
}

有了这个,您甚至可以搜索特定的百分比(如2%)!

替代解决方案

如果您只是想删除百分比字符,您可以使用完全相同的方法,但只需将%-character 映射为空字符串,如以下代码片段所示

"char_filter": {
  "my_percent_char_removal_filter": {
    "type": "mapping",
    "mappings": [
      "% => "]
  }
}

顺便说一句:这种方法不被认为是“hack”,它是在将原始字符串发送到标记器之前修改原始字符串的标准解决方案方法。


推荐阅读