Elasticsearch 西班牙语词干提取不适用于 "rojo" 颜色
Elasticsearch Spanish stemming not working with "rojo" color
我对 ElasticSearch 还很陌生。我正在尝试分析西班牙语的输入,但颜色“rojo”(西班牙语为红色)似乎存在问题。
根据 stemmer demo,字符串“Polera color rojo”(红色衬衫)的词干应为“poler color roj”,而“Polera roja”(红色衬衫)的词干应为“poler roj”,使我能够搜索“rojo”或“roja”并获得这两个结果。
我在 Kibana 的控制台中使用以下代码初始化了索引:
PUT /test
{
"settings": {
"analysis": {
"filter": {
"spanish_stop": {
"type": "stop",
"stopwords": "_spanish_"
},
"spanish_stemmer": {
"type": "stemmer",
"language": "spanish"
}
},
"analyzer": {
"default_search": {
"type":"spanish",
"filter": [
"lowercase",
"spanish_stop",
"spanish_stemmer"
]
}
}
}
},
"mappings":{
"properties":{
"fullname":{
"type":"text",
"analyzer":"default_search"
}
}
}
}
并使用以下代码进行查询:
POST /test/_analyze
{
"analyzer": "default_search",
"text": "polera color rojo"
}
我收到的回复如下:
{
"tokens" : [
{
"token" : "poler",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "color",
"start_offset" : 7,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "rojo",
"start_offset" : 13,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
如您所见,“polera”被正确地词干化为“poler”,但“rojo”却不是。我还尝试了其他颜色和其他东西,添加了更多文本等,但问题似乎与“rojo”有关。
我设法在 AWS 和本地的 Elasticsearch 实例中复制了该问题。它确实适用于复数形式,如“rojas”和“rojos”,将它们保留为“roj”。
也许我配置有误,或者这实际上是 Elasticsearch 中的西班牙语词干提取问题?
编辑:问题似乎出在字长上?同样的问题也发生在“coma”和“como”上,它们应该被词干化为“com”,但事实并非如此。如果我输入“comas”,它就会变成“com”。
似乎词干分析器类型有一个最小令牌长度,我尝试使用“rojos”而不是“rojo”并词干为“roj”。
您可以尝试使用其他方法,例如 Snowball Stemming
PUT /test_spanish
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [ "lowercase", "my_snow" ]
}
},
"filter": {
"my_snow": {
"type": "snowball",
"language": "Spanish"
}
}
}
}
}
POST /test_spanish/_analyze
{
"analyzer": "my_analyzer",
"text": "polera color rojo"
}
{
"tokens" : [
{
"token" : "poler",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "color",
"start_offset" : 7,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "roj",
"start_offset" : 13,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
我对 ElasticSearch 还很陌生。我正在尝试分析西班牙语的输入,但颜色“rojo”(西班牙语为红色)似乎存在问题。
根据 stemmer demo,字符串“Polera color rojo”(红色衬衫)的词干应为“poler color roj”,而“Polera roja”(红色衬衫)的词干应为“poler roj”,使我能够搜索“rojo”或“roja”并获得这两个结果。
我在 Kibana 的控制台中使用以下代码初始化了索引:
PUT /test
{
"settings": {
"analysis": {
"filter": {
"spanish_stop": {
"type": "stop",
"stopwords": "_spanish_"
},
"spanish_stemmer": {
"type": "stemmer",
"language": "spanish"
}
},
"analyzer": {
"default_search": {
"type":"spanish",
"filter": [
"lowercase",
"spanish_stop",
"spanish_stemmer"
]
}
}
}
},
"mappings":{
"properties":{
"fullname":{
"type":"text",
"analyzer":"default_search"
}
}
}
}
并使用以下代码进行查询:
POST /test/_analyze
{
"analyzer": "default_search",
"text": "polera color rojo"
}
我收到的回复如下:
{
"tokens" : [
{
"token" : "poler",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "color",
"start_offset" : 7,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "rojo",
"start_offset" : 13,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
如您所见,“polera”被正确地词干化为“poler”,但“rojo”却不是。我还尝试了其他颜色和其他东西,添加了更多文本等,但问题似乎与“rojo”有关。
我设法在 AWS 和本地的 Elasticsearch 实例中复制了该问题。它确实适用于复数形式,如“rojas”和“rojos”,将它们保留为“roj”。
也许我配置有误,或者这实际上是 Elasticsearch 中的西班牙语词干提取问题?
编辑:问题似乎出在字长上?同样的问题也发生在“coma”和“como”上,它们应该被词干化为“com”,但事实并非如此。如果我输入“comas”,它就会变成“com”。
似乎词干分析器类型有一个最小令牌长度,我尝试使用“rojos”而不是“rojo”并词干为“roj”。
您可以尝试使用其他方法,例如 Snowball Stemming
PUT /test_spanish
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [ "lowercase", "my_snow" ]
}
},
"filter": {
"my_snow": {
"type": "snowball",
"language": "Spanish"
}
}
}
}
}
POST /test_spanish/_analyze
{
"analyzer": "my_analyzer",
"text": "polera color rojo"
}
{
"tokens" : [
{
"token" : "poler",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "color",
"start_offset" : 7,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "roj",
"start_offset" : 13,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}