首页 > 其他分享 >Elasticsearch 自定义分词同义词环节的这个细节不大好理解......

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......

时间:2022-10-18 22:33:52浏览次数:88  
标签:index synonym 自定义 POST ipod Elasticsearch test pod ......


1、问题引出

球友认证考试前一天晚上提问:

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......_twitter

扩展背景描述:

这是 Elasticsearch 自定义分词 Text analysis 章节 Token filter reference 小节的 同义词 token 过滤 (Synonym token filter)的一个参数。

的确,官方文档讲解的不详细。

我们彻底解读一下。

2、自定义分词基础认知

如果读者们对自定义分词的实现有疑问,推荐阅读:

​Elasticsearch自定义分词,从一个问题说开去​

3、给个实战例子,一探究竟

3.1 自定义分词 DSL

PUT test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [
"synonym"
]
}
},
"filter": {
"synonym": {
"type": "synonym",
"lenient": true,
"synonyms": [
"ipod, i-pod, i pod"
]
}
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "synonym"
}
}
}
}

解读如下:

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......_es_02

如图所示,结合前面的 DSL 定义。

  • 自定义分词器的名字:synonym。
  • tokenizer 使用:whitespace 空白分词器。
  • filter 也就是 token filter 使用:synonym 同义词实现。

而空白分隔分词器的本质,举例如下:

POST _analyze
{
"analyzer": "whitespace",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

分词后的结果为:


The

2

QUICK

Brown-Foxes

jumped

over

the

lazy

dog's

bone.

概括一下:空格分词器在遇到空格字符时会将文本分解为多个词,仅以空格作为分词分隔单元。

3.2  token filter 细节参数解读

  • 参数 1 —— "type": "synonym"

含义:同义词类型。

  • 参数 2 ——"lenient": true

含义:如果为 true,则在解析同义词配置时会忽略异常。重要的是要注意,只有那些无法解析的同义词规则才被忽略。

默认值:false。

  • 参数 3 —— "synonyms"

指定同义词,也就是指定谁和谁成为同义词。

  • 参数4 ——“expand ”

这个就是文章开头提及的参数,缺省值就是 true。所以上述 DSL 并没有显示指定。

那参数:expand 到底啥意思呢?

4、通过对比,认清 expand 含义

4.1 验证 DSL

POST test_index/_doc/1
{"title":"ipod is my love"}

POST test_index/_doc/2
{"title":"i-pod is my love"}

POST test_index/_doc/3
{"title":"i pod is my love"}

POST test_index/_search
{
"query": {
"match": {
"title": "ipod"
}
}
}

POST test_index/_search
{
"query": {
"match": {
"title": "i-pod"
}
}
}

POST test_index/_search
{
"query": {
"match": {
"title": "i pod"
}
}
}

4.2 expand设置为 true

默认值,无需指定即可生效。

分词验证一把:

POST test_index/_analyze
{
"text":"i pod is my love",
"analyzer": "synonym"
}

结论截图如下:

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......_elasticsearch_03

执行 4.1 的 DSL,检索任何一个,全量三个文档都能返回。

ipod, i-pod, i pod 的含义如下:

具体意思:

  • ipod 等价于  ipod, i-pod, i pod 三个的每一个。
  • i-pod等价于  ipod, i-pod, i pod 三个的每一个。
  • i pod 等价于  ipod, i-pod, i pod 三个的每一个。

而,"ipod, i-pod, i pod => ipod"的含义如下:

POST test_index/_analyze
{
"text":"i pod is my love",
"analyzer": "synonym"
}

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......_twitter_04

进一步解读为:

  • ipod 仅等价于  ipod,。
  • i-pod 仅等价于  ipod,。
  • i pod 仅等价于  ipod,。

4.3 expand设置为 false

DELETE test_index
PUT test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [
"synonym"
]
}
},
"filter": {
"synonym": {
"type": "synonym",
"expand":false,
"lenient": true,
"synonyms": [
"ipod, i-pod, i pod"
]
}
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "synonym"
}
}
}
}

POST test_index/_analyze
{
"text":"i pod is my love",
"analyzer": "synonym"
}


POST test_index/_analyze
{
"text":"i-pod is my love",
"analyzer": "synonym"
}

上述最后两个 analyze 分词结果为:

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......_elasticsearch_05

ipod, i-pod, i pod 的含义如下:ipod, i-pod, i pod 和 ipod 等价。具体意思:

  • ipod  仅 等价于  ipod一个。
  • i-pod  仅 等价于  ipod一个。
  • i pod 仅 等价于  ipod一个。

"ipod, i-pod, i pod => ipod"的含义同 4.2 解读,不再赘述。

5、有了结论再看官方文档

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......_filter_06

expand 是扩展的意思。

  • 如果为 true,支持扩展,和每一个同义词是同义词。
  • 如果为 false,不支持扩展,仅和最后指向的同义词同义。

6、小结

实践一把,探究真相!

和你一起,死磕 Elastic!



Elastic 核心知识点脑图解读,助力快速建立全局知识体系!

Elasticsearch 自定义分词同义词环节的这个细节不大好理解......_twitter_07


中国最大的 Elastic 非官方公众号


标签:index,synonym,自定义,POST,ipod,Elasticsearch,test,pod,......
From: https://blog.51cto.com/elasticsearch/5768290

相关文章

  • 且慢!听说你线上环境准备选型 Elasticsearch SQL 了?
    1、由两个线上问题说开去问题1:用Elasticsearch做宽表的报表查询,我们打算用jdbc的方式访问,方便开发(使用sql),这种方式还是用JAVA封装的方法好。有没有坑?问题2:Elasticsearch......
  • 干货 | Elasticsearch 冷热集群架构实战
    Elasticsearch最少必要知识实战教程直播回放0、题记Elasticsearch实战数据量级少的时候,单节点就能玩的很6,但是随着数据量的增长,多节点分布式横向扩展集群是大势所趋。之前......
  • 干货 | Elasticsearch基础但非常有用的功能之二:模板
    Elasticsearch最少必要知识实战教程直播回放1、引言业务场景1:数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创......
  • 探究 | Elasticsearch集群规模和容量规划的底层逻辑
    Elasticsearch最少必要知识实战教程直播回放0、引言实战中经常遇到的问题:问题1:请问下大家是如何评估集群的规模?比如数据量达到百万,千万,亿万,分别需要什么级别的集群,这要......
  • 干货 | Elasticsearch 索引设计实战指南
    题记随着Elastic的上市,ELKStack不仅在BAT的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用Elasticsearch了。随之而来......
  • 实战 | Elasticsearch自定义评分的N种方法
    Elasticsearch最少必要知识实战教程直播回放1、期望Elasticsearch搜索结果更准确,不可回避的三个问题问题1:用户真正的需求是什么? 如果不能获得用户的搜索意图,搜索的准确......
  • Elasticsearch实战 | 如何从数千万手机号中识别出情侣号?
    1、问题描述您好,请教个问题。我现在有2千多万的手机号码信息保存在es里。5个分片,3个节点。现在的需求是将后八位相同的号码匹配到一起,重新放到一个index里。组成情侣号。方......
  • 干货 | Elasticsearch开发人员最佳实战指南
    Elasticsearch最少必要知识实战教程直播回放题记几个月以来,我一直在记录自己开发Elasticsearch应用程序的最佳实践。本文梳理的内容试图传达Java的某些思想,我相信其同样......
  • Elasticsearch能检索出来,但不能正确高亮怎么办?
    1、问题引出微信群里的线上实战问题:诸位大哥,es中:keyword类型的字段进行高亮查询,值为123asd456,查询sd4,高亮结果是em123asd456em有没有办法只对我查询的sd4高亮?明明查询......
  • Elasticsearch 聚合数据结果不精确,怎么破?
    1、实战开发遇到聚合问题请教一个问题,ES在聚合的时候发生了一个奇怪的现象聚合的语句里面size设置为10和大于10导致聚合的数量不一致,这个size不就是返回的条数吗?会影响统计......