elasticsearch:如何映射常见的人物错误?

时间:2017-06-26 14:38:06

标签: elasticsearch

我想用我的语言映射常见错误,如:

xampu - >洗发水

洗发水是一个英语单词,但在巴西常用。用葡萄牙语," ch"听起来像" x",有时候" s"听起来像" z"。我们也没有" y"关于我们的语言,但它在名字和外来词上很常见 - 听起来像是"我"。

所以我想映射一个字符替换,但也保留原始单词在同一位置。

因此映射表将是:

ch -> x
sh -> x
y -> i
ph -> f
s -> z

我已经看过"字符过滤器",但它似乎只支持替换: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-mapping-charfilter.html

我想根据原文创建衍生词,这样即使输入错误,用户也可以找到正确的词。要存档,请使用以下产品名称:

SHAMPOO NIVEA MEN

应该被标记为:

0: SHAMPOO, XAMPOO
1: NIVEA
2: MEN

我正在使用同义词过滤器,但我需要使用同义词来表达每个单词。

有什么办法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

对于您的用例,Multi-Field似乎最适合您。您可以通过两种方式对字段进行分析,一种使用standard,另一种使用custom analyzer创建的mapping Char Filter

看起来像是:

创建索引

PUT my_index
{
  "settings": {
  "analysis": {
  "analyzer": {
    "my_analyzer": {
      "tokenizer": "standard",
      "char_filter": [
        "my_char_filter"
      ]
    }
  },
  "char_filter": {
    "my_char_filter": {
      "type": "mapping",
      "mappings": [
        "ch => x",
         "sh => x",
        "y => i",
        "ph => f",
        "s => z"
      ]
      }
     }
   } 
  }
}

创建多字段

POST my_index/_mapping/my_type
{
   "properties": {
   "field_name": {
     "type": "text",
     "analyzer": "standard",
     "fields": {
        "mapped": {
           "type": "text",
           "analyzer": "my_analyzer"
           }
         }
      }
    }
 }

上面的映射会创建两个版本的field_name,一个用is standard分析器进行分析,另一个用你创建的custom analyzer进行分析。

为了查询两者,您可以在两个版本上使用should

GET my_index/_search
{
  "query": {
  "bool": {
     "should": [
        {
           "match": {
              "field_name": "xampoo"
           }
        },
        {
           "match": {
              "field_name.mapped": "shampoo"
           }
           }
        ]
      }
    }  
  }

希望这可以帮助你!!