elasticsearch Elasticsearch西班牙语词干不与“一起使用”;“rojo”;颜色,elasticsearch,kibana,stemming,elasticsearch,Kibana,Stemming" /> elasticsearch Elasticsearch西班牙语词干不与“一起使用”;“rojo”;颜色,elasticsearch,kibana,stemming,elasticsearch,Kibana,Stemming" />

elasticsearch Elasticsearch西班牙语词干不与“一起使用”;“rojo”;颜色

elasticsearch Elasticsearch西班牙语词干不与“一起使用”;“rojo”;颜色,elasticsearch,kibana,stemming,elasticsearch,Kibana,Stemming,我对ElasticSearch相当陌生。我试图用西班牙语分析输入,但颜色“rojo”(西班牙语中的红色)似乎有问题 根据,字符串“Polera color rojo”(红色衬衫)应词干为“poler color roj”,而“Polera roja”(红色衬衫)应为“poler roj”,使我能够搜索为“rojo”或“roja”,并获得两个结果 我在Kibana的控制台中使用以下代码初始化了索引: PUT /test { "settings": { "

我对ElasticSearch相当陌生。我试图用西班牙语分析输入,但颜色“rojo”(西班牙语中的红色)似乎有问题

根据,字符串“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
    }
  ]
}
{
“代币”:[
{
“令牌”:“波尔”,
“起始偏移量”:0,
“端部偏移”:6,
“类型”:“,
“位置”:0
},
{
“标记”:“颜色”,
“起始偏移量”:7,
“端部偏移”:12,
“类型”:“,
“职位”:1
},
{
“令牌”:“rojo”,
“起始偏移量”:13,
“端部偏移”:17,
“类型”:“,
“职位”:2
}
]
}
正如你所看到的,“polera”被正确地定义为“poler”,但“rojo”不是。我还尝试了其他颜色和东西,添加了更多的文本,等等。但问题似乎与“rojo”有关

我设法在AWS中的Elasticsearch实例和本地实例中复制了这个问题。它确实适用于复数形式,如“rojas”和“rojos”,将它们保留为“roj”

也许我配置错了,或者这实际上是Elasticsearch中西班牙语词干的问题


编辑:似乎问题在于字长?同样的问题也发生在“coma”和“como”上,这两个词的词干应该是“com”,但不是。如果我加上“comas”,它的词干会变成“com”。

似乎词干分析器类型有一个最小的标记长度,我尝试用“rojos”代替“rojo”,词干变成“roj”

您可以尝试另一种方法,如

{
“代币”:[
{
“令牌”:“波尔”,
“起始偏移量”:0,
“端部偏移”:6,
“类型”:“,
“位置”:0
},
{
“标记”:“颜色”,
“起始偏移量”:7,
“端部偏移”:12,
“类型”:“,
“职位”:1
},
{
“令牌”:“roj”,
“起始偏移量”:13,
“端部偏移”:17,
“类型”:“,
“职位”:2
}
]
}

这就解决了问题。谢谢我应该注意的是,标准词干分析和Snowball词干分析之间有什么大的区别吗?@EduardoPérez Snowball只是算法的名称,所以实现相同效果的方法也不同。有趣的是“stemmer类型”的西班牙语链接指向snowball网站,因此我们可以推断存在相同的snowball,标记长度限制(?)
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
    }
  ]
}