ElasticSearch学习笔记(四)--分析器

分析器

一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照++顺序++被执行:

  • 字符过滤器 例如去掉html标签,或者将"&"转"and"。一个分析器可能有0个或者多个字符过滤器。
  • 分词器 分词器把字符串分解成单个词条或者词汇单元。一个分析器++必须有一个唯一++的分词器。
  • 词单元过滤器 经过分词,作为结果的词单元流会按照++指定的顺序++通过指定的词单元过滤器 。例如执行小写化、删除"a","then"等无用词、或增加像jump和leap这种同义词。

自定义分析器

  • 语法结构
PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": { ... custom character filters ... },
            "tokenizer":   { ...    custom tokenizers     ... },
            "filter":      { ...   custom token filters   ... },
            "analyzer":    { ...    custom analyzers      ... }
        }
    }
}

char_fiter 字符过滤器

tokenizer 分词器

filter 词单元过滤器

analyzer 分析器

  • 示例如下
PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "&_to_and": {
                    "type":       "mapping",
                    "mappings": [ "&=> and "]
            }},
            "filter": {
                "my_stopwords": {
                    "type":       "stop",
                    "stopwords": [ "the", "a" ]
            }},
            "analyzer": {
                "my_analyzer": {
                    "type":         "custom",
                    "char_filter":  [ "html_strip", "&_to_and" ],
                    "tokenizer":    "standard",
                    "filter":       [ "lowercase", "my_stopwords" ]
            }}
}}}

IK分析器

因为elasticsearch默认的分词器standard不太适用于中文,例如默认分析器会把"幸福家园3期"分解为["幸","福","家","园","3","期"],所以在实际应用时,大部分都是用一些中文分析器。IK分析器就是其中之一。

ik分析器地址 https://github.com/medcl/elasticsearch-analysis-ik

下载安装IK

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip

下载完成后,重启elasticsearch。

测试分析器
GET /employee/_analyze
{
    "analyzer": "ik_max_word",
    "text": "幸福家园3期"
}

响应的结果

{
  "tokens": [
    {
      "token": "幸福",
      "start_offset": 0,
      "end_offset": 2,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "家园",
      "start_offset": 2,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "3",
      "start_offset": 4,
      "end_offset": 5,
      "type": "ARABIC",
      "position": 2
    },
    {
      "token": "期",
      "start_offset": 5,
      "end_offset": 6,
      "type": "COUNT",
      "position": 3
    }
  ]
}
使用ik分析器

测试安装ik成功后,就可以在新建索引时,指定某字段的分析器为ik。

PUT /test
{
  "mappings": {
    "doc": {
      "properties": {
        "chinese_txt": {
          "type": "text",
          "analyzer": "ik_max_word",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

ik分析器可以让用户自定义本地或远程的字典库、停止词库,还支持热更新。更详细的说明请查看ik官方说明。

如同 match 查询这样的高层查询知道字段映射的关系,能为每个被查询的字段应用正确的分析器。 可以使用 validate-query API 查看这个行为, 其中在索引时指定了english_title的分析器为english:

GET /my_index/my_type/_validate/query?explain
{
    "query": {
        "bool": {
            "should": [
                { "match": { "title":         "Foxes"}},
                { "match": { "english_title": "Foxes"}}
            ]
        }
    }
}

返回语句的 explanation 结果:(title:foxes english_title:fox)

在搜索时和索引时可以使用不同的分析器

Elasticsearch支持一个可选的 search_analyzer 映射,它仅会应用于搜索时。

转载于:https://my.oschina.net/k2XI0fj/blog/1609232

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值