请教大家一个问题,
软件版本: es 6.8.20
1. 如下,添加了一个索引
{{url-es}}/goods2/_settings/
之后分析 分词效果
苹果手机先经过tokenizer分词为 苹果, 手机,然后这两个分词在同义词中都没有对应的结果,那么结果应该只有 苹果,手机;
但是结果还有一个iphone,明显是通过苹果手机直接对应了同义词iphone;那难道是同义词过滤器有特殊情况,
synonym token filter 先于tokenizer执行吗
但是我查阅的大部分资料都是说分析器执行顺序是character filter-》tokenzier-》filter
希望有大神解答一下,是不是我漏了什么地方或者理解有问题
软件版本: es 6.8.20
1. 如下,添加了一个索引
{{url-es}}/goods2/_settings/
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"updateable": true
"synonyms_path": "/etc/elasticsearch/analysis/synonym.txt"
}
},
"analyzer": {
"my_synonyms_analyzer": {
"tokenizer": "ik_smart",
"filter": [
"my_synonym_filter"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "my_synonyms_analyzer"
}
}
}
}
}
同义词在文件中设置为 iPhone,苹果手机 => iPhone,苹果手机之后分析 分词效果
{{url-es}}/goods2/_analyze
{
"analyzer": "my_synonyms_analyzer",
"text": "苹果手机"
}
返回
{
"tokens": [
{
"token": "iphone",
"start_offset": 0,
"end_offset": 4,
"type": "SYNONYM",
"position": 0
},
{
"token": "苹果",
"start_offset": 0,
"end_offset": 2,
"type": "SYNONYM",
"position": 0
},
{
"token": "手机",
"start_offset": 2,
"end_offset": 4,
"type": "SYNONYM",
"position": 1
}
]
}
问题:我的理解是,tokenizer是先于token filter执行的苹果手机先经过tokenizer分词为 苹果, 手机,然后这两个分词在同义词中都没有对应的结果,那么结果应该只有 苹果,手机;
但是结果还有一个iphone,明显是通过苹果手机直接对应了同义词iphone;那难道是同义词过滤器有特殊情况,
synonym token filter 先于tokenizer执行吗
但是我查阅的大部分资料都是说分析器执行顺序是character filter-》tokenzier-》filter
希望有大神解答一下,是不是我漏了什么地方或者理解有问题
2 个回复
nofearinmyheat - 新时代农民工
赞同来自:
ik_smart分词后确实不会出现“苹果手机”,搞了半天我也没弄明白处理逻辑。。
插眼 等个大佬
实验过程
运行结果:
nofearinmyheat - 新时代农民工
赞同来自:
不过上文的同义词源定义多少有点小问题,建议参考下官方文档
简单扩展
格式:"jump,hop,leap"
扩展可以应用在索引阶段或查询阶段
简单收缩
格式:"leap,hop => jump"
它必须同时应用于索引和查询阶段,以确保查询词项映射到索引中存在的同一个值。
类型扩展
格式:
"cat => cat,pet", "kitten => kitten,cat,pet", "dog => dog,pet" "puppy => puppy,dog,pet"
通过在索引阶段使用类型扩展:查询向下,查询cat会找到关于Kitten和cat相关文档;
或者在查询阶段使用类型扩展, kitten 的查询结果就会被拓展成涉及到 kittens、cats、dogs。【有点疑惑为啥会有dog】