首页 > 解决方案 > ElasticSearch 中的英语分析器(词干)不起作用

问题描述

我尝试应用自定义英语分析器,以及弹性搜索中的标准英语分析器。我的目标是特别使用词干。因此,假设我的文档中有以下词:封面、印象。

现在,如果我搜索封面或印象深刻或印象,我会得到 0 个结果。只有当我搜索确切的术语“封面”或“印象”时,我才会找到结果。

这是我在 elasticsearch 中的设置(根据本文档https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html):

{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        },
        "english_stemmer": {
          "type":       "stemmer",
          "language":   "english"
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english"
        }
      },
      "analyzer": {
        "rebuilt_english": {
          "tokenizer":  "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_stemmer"
          ]
        }
      }
    }
  }
}

我的映射如下所示:

"mapping": {
  "_doc": {
     "properties": {
        "title": {"type": "text",
                   "analyzer": "rebuilt_english"},
        "description: {"type": text"
                       "analyzer": "rebuilt_english"}
  }
 }
}

我还尝试(根据几个不同的教程)更改这样的设置(我只是在此处添加更改,而不是再次添加完整代码):

{
  "settings": {
    "analysis": {
    "analyzer: "rebuilt_english" {
    "type": "custom",
     "filter": #and so on...

我在这里想念什么吗?据我了解,我需要在“设置”中设置特定分析器的设置,给它一个名称,然后在“映射”属性中使用该名称,因此每个项目都根据上面设置的设置进行分析。

我还尝试不设置任何特定设置,而只是为每个项目设置分析器属性(在映射中),例如:

"title": {"type": "text",
"analyzer": "english"}

这也不起作用(即使使用像词干这样的过滤器)。

我真的试图找到几个小时的解决方案,但我无法让它发挥作用。帮助将不胜感激。谢谢!

更新

这是我用来创建索引的代码(我最近的尝试,根据我的描述我还尝试了其他方法来应用该方法):

PUT /my_index

{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_english": {
          "type": "custom",
      "filter": {
        "english_stop": {
          "type": "stop",
          "stopwords": "_english"
        },
        "english_stemmer": {
          "type": "stemmer",
          "language": "english"
        },
        "english_possessive_stemmer": {
          "type": "stemmer",
          "language": "possessive_english"
        },
          "tokenizer": "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_stemmer"
            ]
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "title": { "type": "text",
          "analyzer": "rebuilt_english"
        },
        "description": { "type": "text",
                    "analyzer": "rebuilt_english"}
                    }
        }
      }
    }
}

标签: elasticsearchanalyzerstemming

解决方案


PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "english_stop": {
          "type":"standard",
          "stopwords": "_english_"
          },
          "my_analyzer": {
            "type":"custom",
            "tokenizer":"standard",
            "filter":["my_stemmer"]
          }
        },
        "filter": {
          "my_stemmer":{
            "type": "stemmer",
            "language": "english"
          }
        }
    }
  }
}

POST /my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "I'm in the mood for drinking semi-dry wine!"
}

我认为这会有所帮助。谢谢。


推荐阅读