我尝试在弹性搜索中应用自定义英语分析器以及标准英语分析器。我的目标特别是使用词干。所以我要说我的文件中有以下文字:封面,印象。
现在,如果我搜索例如覆盖或令人印象深刻或印象,我得到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"}
这也不起作用(即使使用像词干这样的过滤器)。
我真的试图找到一个解决方案几个小时,但我无法让它工作。非常感谢帮助。谢谢!
UPDATE
这是我用来创建索引的代码(我的最新尝试,根据我的描述,我还尝试了其他方法来应用该方法):
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"}
}
}
}
}
}
你的问题是你有你的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"
}
}
}
}
}
}
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!"
}
我认为这会有所帮助。谢谢。