ElasticSearch 备考 -- 自定义分词

一、题目

在集群上有一个索引task_new,brand字段match搜索 'Yoo-Hoo' 有3个,match搜索 'YooHoo' 有10个,请重建它到task_new 索引上,并满足以下要求:

集群一的 brand 字段包含关键字 'Yoo-Hoo' 和 'YooHoo',不管搜索 'yoohoo' 还是 'yoo-hoo',它的结果应该一样,都是3个。

task_new 和 task 的 doc 和 mapping 一样,mapping 要拷贝,不能直接 reindex

POST task/_doc/1

{"title":"Yoo-Hoo"}

POST task/_doc/2

{"title":"YooHoo"}

二、思考

通过分析题目,我们发现要查询两个不同的值都可以搜索到,主要是通过自定义分词进行实现。实现前先来了解一下自定义分词器的标准结构。

自定义分词包括三个部分,执行顺序从上到下为。

1、character filter 字符过滤器

  • 作用:原始文本作为字符流接收,并通过添加、删除或更改字符来转换字符流
  • 包括:html_strip(html标签过滤)、mapping(字符映射)、pattern_replace(正则匹配)
  • 限制:数组类型,可以有0~n个

例如:<p>I'm a :) person, and you?</p> 文档为未分词前,在执行过character filter后通过html

2、tokenizer 分词切分器

  • 作用:tokenizer 负责在接收字符流后对文本分词
  • 包括:常用包括 whitespace(空格切分)、keyword(不做切分)、standard(基于Unicode切分)、lowercase(分词后转为小写)
  • 限制:仅1个

3、token filter 分词过滤器

  • 作用:对tokenizer处理后的字符流进行过滤处理,如:转换为小写、删除(去除停用词)等
  • 包括:常用包括 stop(停止词过滤)、synonym(同义词过滤)
  • 限制:数组类型,可以有0~n个

通过以上对自定义分词简单介绍,发现可以使用两种方式解答,1)character filter 字符过滤器中配置mapping对字符进行映射处理;2)token filter 分词过滤器中配置synonym同义词过滤字符

三、解题

初始化索引task

# DELETE task
# 初始化索引 task
PUT task
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      }
    }
  }
}

# 初始化数据
POST task/_doc/1
{"title":"Yoo-Hoo"}
POST task/_doc/2
{"title":"YooHoo"}

方案一:character filter 中配置 mapping

Step 1、创建自定义分词、字段指定自定义分词

这里character filter 类型为 mapping类型,通过指定mapping 将下滑线指定为空。

mapping中指定 text 类型字段的 analyzer 为创建的自定义分词"mapping_analyzer"

# DELETE task_new
PUT task_new
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1,
    "analysis": {
      "analyzer": {
        "mapping_analyzer": {
          "char_filter": [
            "my_mapping"
          ],
          "tokenizer": "whitespace",
          "filter": [
            "lowercase"
          ]
        }
      },
      "char_filter": {
        "my_mapping": {
          "type": "mapping",
          "mappings": [
            "- => "
          ]
        }
      },
      "tokenizer": {},
      "filter": {}
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "mapping_analyzer"
      }
    }
  }
}

Step 2、执行reindex操作将数据导入task_new 索引

POST _reindex
{
  "source": {
    "index": "task"
  },
  "dest": {
    "index": "task_new"
  }
}

Step 3、执行查询语句

POST task_new/_search
{
  "query": {
    "match": {
      "title": "Yoo-Hoo"
    }
  }
}

方案二:token filter 中配置 synonym

Step 1、创建自定义分词、字段指定自定义分词

创建自定义filter,命名为"my_synonym",使用同义词filter类型,并定义相关同义词,在mapping中自定义分词中filter指定my_synonym

#DELETE task_new
PUT task_new
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1,
    "analysis": {
      "analyzer": {
        "mapping_analyzer": {
          "char_filter": [],
          "tokenizer": "whitespace",
          "filter": [
            "lowercase","my_synonym"
          ]
        }
      },
      "char_filter": {
      },
      "tokenizer": {},
      "filter": {
        "my_synonym":{
          "type": "synonym",
          "synonyms": [ "Yoo-Hoo, YooHoo => YooHoo" ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "mapping_analyzer"
      }
    }
  }
}

Step 2、3 同方案一

四、总结

1)自定义分词重点要记自定义分词器的标准结构,三个模块:character filter,tokenizer,filter 各各自的作用、数量限制、下面常用的类型。

2)例如:character filter 常用mapping,filter常用 synonym

3)注意自定义分词只能用在字段为text上,keyword 不可以的。


参考资料

送一波福利:

福利一

有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!

有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!

有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!

福利二

对于ant-design-vue表单的自定义校验规则,你可以使用Vue的"自定义校验器"来实现。下面是一个简单的示例: 1. 首先,你需要在Vue组件中定义一个自定义校验器函数,该函数接收两个参数:rule和value。rule是当前校验规则的配置,value是当前表单字段的值。校验器函数需要返回一个Promise对象,通过resolve()来表示校验通过,通过reject()来表示校验失败。 ```javascript // 导入所需的校验规则 import { ValidationRule } from 'ant-design-vue/es/form/Form'; // 定义校验器函数 const customValidator = (rule, value) => { return new Promise((resolve, reject) => { // 自定义校验逻辑 if (value === 'custom') { resolve(); } else { reject(new Error('输入值不合法')); } }); }; ``` 2. 在表单项的rules属性中使用自定义校验器函数。rules属性是一个数组,可以包含多个校验规则。在自定义校验规则中,你可以使用ValidationRule对象提供的方法来定义校验规则的其他配置。 ```javascript <template> <a-form :form="form"> <a-form-item label="自定义校验"> <a-input v-decorator="['customField', { rules: [{ validator: customValidator }] }]"></a-input> </a-form-item> <!-- 其他表单项 --> <!-- ... --> </a-form> </template> <script> export default { data() { return { form: this.$form.createForm(this), }; }, }; </script> ``` 这样,当用户输入的值不等于'custom'时,校验器函数将返回一个带有错误信息的Promise对象,从而触发表单项的校验错误提示。 以上就是使用ant-design-vue实现表单自定义校验规则的方法。你可以根据自己的需要编写更复杂的校验逻辑,并在自定义校验器函数中进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值