在 Elasticsearch 上保留非词干标记
Keep non-stemmed tokens on Elasticsearch
当我在 Elasticsearch 上索引文档时,我正在使用词干分析器(针对巴西葡萄牙语)。这是我的默认分析器的样子(这里有 nvm 小错误,因为我已经从服务器中的代码中手动复制了它):
"analysis":{
"filter":{
"my_asciifolding": {
"type":"asciifolding",
"preserve_original":true,
},
"stop_pt":{
"type": "stop",
"ignore_case": true,
"stopwords": "_brazilian_"
},
"stemmer_pt":{
"type":"stemmer",
"language":"brazilian"
}
},
"analyzer":{
"default":{
"type":"custom",
"tokenizer":"standard",
"filter":{
"lowercase",
"my_asciifolding",
"stop_pt",
"stemmer_pt"
}
}
}
}
我还没有真正触及我的类型映射(除了我声明的几个数字字段 "type":"long"
)所以我希望大多数字段都使用我在上面指定的默认分析器。
这按预期工作,但问题是一些用户感到沮丧,因为(因为令牌被阻止),查询 "vulnerabilities"
和查询 "vulnerable
" return 相同的结果,这是一种误导,因为他们期望具有完全匹配的结果排在第一位。
在 elasticsearch 中执行此操作的默认方式(如果有)是什么? (也许在索引中保留无词干的标记以及有词干的标记?)我使用的是 1.5.1 版。
我最终使用 "fields"
字段以不同方式索引我的属性。不确定这是否是最优的,但这是我现在处理它的方式:
添加另一个分析器(我称之为 "no_stem_analyzer"
),其中包含 "default"
分析器具有的所有过滤器,减去 "stemmer"
.
对于我想同时保留非词干和词干变体的每个属性,我这样做了(字段 "DESCRIPTION"
的示例):
"mappings":{
"_default_":{
"properties":{
"DESCRIPTION":{
"type"=>"string",
"fields":{
"no_stem":{
"type":"string",
"index":"analyzed",
"analyzer":"no_stem_analyzer"
},
"stemmed":{
"type":"string",
"index":"analyzed",
"analyzer":"default"
}
}
}
},//.. other attributes here
}
}
在搜索时(使用 query_string_query
)我还必须指出(使用字段 "fields"
)我想搜索所有子字段(例如 "DESCRIPTION.*"
)
我的方法也基于[这个答案]。()
当我在 Elasticsearch 上索引文档时,我正在使用词干分析器(针对巴西葡萄牙语)。这是我的默认分析器的样子(这里有 nvm 小错误,因为我已经从服务器中的代码中手动复制了它):
"analysis":{
"filter":{
"my_asciifolding": {
"type":"asciifolding",
"preserve_original":true,
},
"stop_pt":{
"type": "stop",
"ignore_case": true,
"stopwords": "_brazilian_"
},
"stemmer_pt":{
"type":"stemmer",
"language":"brazilian"
}
},
"analyzer":{
"default":{
"type":"custom",
"tokenizer":"standard",
"filter":{
"lowercase",
"my_asciifolding",
"stop_pt",
"stemmer_pt"
}
}
}
}
我还没有真正触及我的类型映射(除了我声明的几个数字字段 "type":"long"
)所以我希望大多数字段都使用我在上面指定的默认分析器。
这按预期工作,但问题是一些用户感到沮丧,因为(因为令牌被阻止),查询 "vulnerabilities"
和查询 "vulnerable
" return 相同的结果,这是一种误导,因为他们期望具有完全匹配的结果排在第一位。
在 elasticsearch 中执行此操作的默认方式(如果有)是什么? (也许在索引中保留无词干的标记以及有词干的标记?)我使用的是 1.5.1 版。
我最终使用 "fields"
字段以不同方式索引我的属性。不确定这是否是最优的,但这是我现在处理它的方式:
添加另一个分析器(我称之为
"no_stem_analyzer"
),其中包含"default"
分析器具有的所有过滤器,减去"stemmer"
.对于我想同时保留非词干和词干变体的每个属性,我这样做了(字段
"DESCRIPTION"
的示例):"mappings":{ "_default_":{ "properties":{ "DESCRIPTION":{ "type"=>"string", "fields":{ "no_stem":{ "type":"string", "index":"analyzed", "analyzer":"no_stem_analyzer" }, "stemmed":{ "type":"string", "index":"analyzed", "analyzer":"default" } } } },//.. other attributes here } }
在搜索时(使用 query_string_query
)我还必须指出(使用字段 "fields"
)我想搜索所有子字段(例如 "DESCRIPTION.*"
)
我的方法也基于[这个答案]。(