我试图在弹性搜索中应用定制的英语分析仪以及标准的英语分析仪。我的目的尤其是使用词干。假设我在文档中有以下几句话:封面,印象。
现在,如果我搜索例如封面或印象深刻或印象,我得到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"}
}
}
}
}
}
答案 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"
}
}
}
}
}