球友认证考试前一天晚上提问:
扩展背景描述:
这是 Elasticsearch 自定义分词 Text analysis 章节 Token filter reference 小节的 同义词 token 过滤 (Synonym token filter)的一个参数。
的确,官方文档讲解的不详细。
我们彻底解读一下。
如果读者们对自定义分词的实现有疑问,推荐阅读:
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"
}
}
}
}
解读如下:
如图所示,结合前面的 DSL 定义。
而空白分隔分词器的本质,举例如下:
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. |
概括一下:空格分词器在遇到空格字符时会将文本分解为多个词,仅以空格作为分词分隔单元。
含义:同义词类型。
含义:如果为 true,则在解析同义词配置时会忽略异常。重要的是要注意,只有那些无法解析的同义词规则才被忽略。
默认值:false。
指定同义词,也就是指定谁和谁成为同义词。
这个就是文章开头提及的参数,缺省值就是 true。所以上述 DSL 并没有显示指定。
那参数:expand 到底啥意思呢?
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"
}
}
}
默认值,无需指定即可生效。
分词验证一把:
POST test_index/_analyze
{
"text":"i pod is my love",
"analyzer": "synonym"
}
结论截图如下:
执行 4.1 的 DSL,检索任何一个,全量三个文档都能返回。
ipod, i-pod, i pod 的含义如下:
具体意思:
而,"ipod, i-pod, i pod => ipod"的含义如下:
POST test_index/_analyze
{
"text":"i pod is my love",
"analyzer": "synonym"
}
进一步解读为:
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 分词结果为:
ipod, i-pod, i pod 的含义如下:ipod, i-pod, i pod 和 ipod 等价。具体意思:
"ipod, i-pod, i pod => ipod"的含义同 4.2 解读,不再赘述。
expand 是扩展的意思。
实践一把,探究真相!
和你一起,死磕 Elastic!
Elastic 核心知识点脑图解读,助力快速建立全局知识体系!
本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!