ElasticSearch中的英语分析器(阻止)不起作用

时间:2019-01-24 07:43:25

标签: elasticsearch analyzer stemming

我试图在弹性搜索中应用定制的英语分析仪以及标准的英语分析仪。我的目的尤其是使用词干。假设我在文档中有以下几句话:封面,印象。

现在,如果我搜索例如封面或印象深刻或印象,我得到0个结果。仅当我搜索确切的术语“ covers”或“ impression”时,我才会点击结果。

这是我在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"}
                    }
        }
      }
    }
}

3 个答案:

答案 0 :(得分:0)

您的问题是您拥有filter键,所有命名的过滤器都放在错误的位置。它放在analyzer内,但应该是analyzer的同级键。

所以我敢打赌,以下配置应能按预期工作:

{
  "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":{
          "type":"custom",
          "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"
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

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!"
}

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

答案 2 :(得分:0)

下面的分析器可以工作,修复是在您定义"tokenizer":"standard"时进行的 然后不要定义"type":"standard"字段

PUT /analyzers_test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "my_stemmer",
            "lowercase"
          ]
        }
      },
      "filter": {
        "my_stemmer": {
          "type": "stemmer",
          "name": "english"
        }
      }
    }
  }
}