elasticsearch之內置字符過濾器


前言

字符過濾器在<charFilter>屬性中定義,它是對字符流進行處理。字符過濾器種類不多。elasticearch只提供了三種字符過濾器:

  • HTML字符過濾器(HTML Strip Char Filter)
  • 映射字符過濾器(Mapping Char Filter)
  • 模式替換過濾器(Pattern Replace Char Filter)

我們來分別看看都是怎么玩的吧!

HTML字符過濾器

HTML字符過濾器(HTML Strip Char Filter)從文本中去除HTML元素。

POST _analyze
{
  "tokenizer": "keyword",
  "char_filter": ["html_strip"],
  "text":"<p>I&apos;m so <b>happy</b>!</p>"
}

結果如下:

{
  "tokens" : [
    {
      "token" : """

I'm so happy!

""",
      "start_offset" : 0,
      "end_offset" : 32,
      "type" : "word",
      "position" : 0
    }
  ]
}

映射字符過濾器

映射字符過濾器(Mapping Char Filter)接收鍵值的映射,每當遇到與鍵相同的字符串時,它就用該鍵關聯的值替換它們。

PUT pattern_test4
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer":{
          "tokenizer":"keyword",
          "char_filter":["my_char_filter"]
        }
      },
      "char_filter":{
          "my_char_filter":{
            "type":"mapping",
            "mappings":["蒼井空 => 666","武藤蘭 => 888"]
          }
        }
    }
  }
}

上例中,我們自定義了一個分析器,其內的分詞器使用關鍵字分詞器,字符過濾器則是自定制的,將字符中的蒼井空替換為666,武藤蘭替換為888。

POST pattern_test4/_analyze
{
  "analyzer": "my_analyzer",
  "text": "蒼井空熱愛武藤蘭,可惜后來蒼井空結婚了"
}

結果如下:

{
  "tokens" : [
    {
      "token" : "666熱愛888,可惜后來666結婚了",
      "start_offset" : 0,
      "end_offset" : 19,
      "type" : "word",
      "position" : 0
    }
  ]
}

模式替換過濾器

模式替換過濾器(Pattern Replace Char Filter)使用正則表達式匹配並替換字符串中的字符。但要小心你寫的摳腳的正則表達式。因為這可能導致性能變慢!

PUT pattern_test5
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "(\\d+)-(?=\\d)",
          "replacement": "$1_"
        }
      }
    }
  }
}

上例中,我們自定義了一個正則規則。

POST pattern_test5/_analyze
{
  "analyzer": "my_analyzer",
  "text": "My credit card is 123-456-789"
}

結果如下:

{
  "tokens" : [
    {
      "token" : "My",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "credit",
      "start_offset" : 3,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "card",
      "start_offset" : 10,
      "end_offset" : 14,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "is",
      "start_offset" : 15,
      "end_offset" : 17,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "123_456_789",
      "start_offset" : 18,
      "end_offset" : 29,
      "type" : "<NUM>",
      "position" : 4
    }
  ]
}

我們大致的了解elasticsearch分析處理數據的流程。但可以看到的是,我們極少地在例子中演示中文處理。因為elasticsearch內置的分析器處理起來中文不是很好。所以,后續會介紹一個重量級的插件就是elasticsearch analysis ik(一般習慣稱呼為ik分詞器)。


歡迎斧正,that's all


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM