Elasticsearch 同义词问题
Elasticsearch synonym issue
我查看了与此问题相关的其他问题,但似乎没有帮助。
我必须更改 "i phone" 或 "i Phone" 的输入以在 Elasticsearch 中查询 "iPhone"。
如您所见,我已经尝试了大部分我能想到的方法,包括简单地 "phone => iPhone" 和将 "i" 留在那里并可能将其添加到停用词中。
我已经尝试将 "simple"、"keyword"、"standard" 和 "whitespace" 用于我的自定义分析器。
任何人都可以发现我哪里出错了,这是我完成项目之前的最后一个问题,我们将不胜感激。谢谢
P.S。如果你包括我如何在输入时自动建议,则加分,谢谢
下面是我的代码
public static CreateIndexDescriptor GetMasterProductDescriptor(string indexName = "shopmaster")
{
var indexDescriptor = new CreateIndexDescriptor(indexName)
.Settings(s => s
.Analysis(a => a
.TokenFilters(t => t
.Stop("my_stop", st => st
.StopWords("_english_", "new", "cheap")
.RemoveTrailing()
)
.Synonym("my_synonym", st => st
.Synonyms(
"phone => iPhone"
//"i phone => iPhone",
//"i Phone => iPhone"
)
)
.Snowball("my_snowball", st => st
.Language(SnowballLanguage.English)
)
)
.Analyzers(an => an
.Custom("my_analyzer", ca => ca
.Tokenizer("simple")
.Filters(
"lowercase",
"my_stop",
"my_snowball",
"my_synonym"
)
)
)
)
)
.Mappings(
ms => ms.Map<MasterProduct>(
m => m.AutoMap()
.Properties(
ps => ps
.Nested<MasterProductAttributes>(p => p.Name(n => n.MasterAttributes))
.Nested<MasterProductAttributes>(p => p.Name(n => n.ProductAttributes))
.Nested<MasterProductAttributeType>(p => p.Name(n => n.MasterAttributeTypes))
.Nested<Feature>(p => p.Name(n => n.Features))
.Nested<RelatedProduct>(p => p.Name(n => n.RelatedProducts))
.Nested<MasterProductItem>(
p => p.Name(
n => n.Products
)
.Properties(prop => prop.Boolean(
b => b.Name(n => n.InStock)
))
)
.Boolean(b => b.Name(n => n.InStock))
.Number(t => t.Name(n => n.UnitsSold).Type(NumberType.Integer))
.Text(
tx => tx.Name(e => e.ManufacturerName)
.Fields(fs => fs.Keyword(ss => ss.Name("manufacturer"))
.TokenCount(t => t.Name("MasterProductId")
.Analyzer("my_analyzer")
)
)
.Fielddata())
//.Completion(cm=>cm.Analyzer("my_analyser")
)
)
);
return indexDescriptor;
}
过滤器的顺序很重要!
您正在应用小写字母,然后是词干分析器(滚雪球),然后是同义词。您的同义词包含大写字母,但在应用它们时,小写字母已经出现。最好先应用小写字母,以确保大小写不会影响同义词的匹配,但在这种情况下,您的替换词不应该大写。
不应在同义词之前应用词干分析器(除非您知道自己在做什么,并且正在比较 post-词干提取词)。我相信,雪球会将 'iphone' 转变为 'iphon',因此这是您 运行 遇到麻烦的另一个领域。
"lowercase",
"my_synonym",
"my_stop",
"my_snowball",
(别忘了去掉同义词的大写字母)
我查看了与此问题相关的其他问题,但似乎没有帮助。
我必须更改 "i phone" 或 "i Phone" 的输入以在 Elasticsearch 中查询 "iPhone"。
如您所见,我已经尝试了大部分我能想到的方法,包括简单地 "phone => iPhone" 和将 "i" 留在那里并可能将其添加到停用词中。
我已经尝试将 "simple"、"keyword"、"standard" 和 "whitespace" 用于我的自定义分析器。
任何人都可以发现我哪里出错了,这是我完成项目之前的最后一个问题,我们将不胜感激。谢谢
P.S。如果你包括我如何在输入时自动建议,则加分,谢谢
下面是我的代码
public static CreateIndexDescriptor GetMasterProductDescriptor(string indexName = "shopmaster")
{
var indexDescriptor = new CreateIndexDescriptor(indexName)
.Settings(s => s
.Analysis(a => a
.TokenFilters(t => t
.Stop("my_stop", st => st
.StopWords("_english_", "new", "cheap")
.RemoveTrailing()
)
.Synonym("my_synonym", st => st
.Synonyms(
"phone => iPhone"
//"i phone => iPhone",
//"i Phone => iPhone"
)
)
.Snowball("my_snowball", st => st
.Language(SnowballLanguage.English)
)
)
.Analyzers(an => an
.Custom("my_analyzer", ca => ca
.Tokenizer("simple")
.Filters(
"lowercase",
"my_stop",
"my_snowball",
"my_synonym"
)
)
)
)
)
.Mappings(
ms => ms.Map<MasterProduct>(
m => m.AutoMap()
.Properties(
ps => ps
.Nested<MasterProductAttributes>(p => p.Name(n => n.MasterAttributes))
.Nested<MasterProductAttributes>(p => p.Name(n => n.ProductAttributes))
.Nested<MasterProductAttributeType>(p => p.Name(n => n.MasterAttributeTypes))
.Nested<Feature>(p => p.Name(n => n.Features))
.Nested<RelatedProduct>(p => p.Name(n => n.RelatedProducts))
.Nested<MasterProductItem>(
p => p.Name(
n => n.Products
)
.Properties(prop => prop.Boolean(
b => b.Name(n => n.InStock)
))
)
.Boolean(b => b.Name(n => n.InStock))
.Number(t => t.Name(n => n.UnitsSold).Type(NumberType.Integer))
.Text(
tx => tx.Name(e => e.ManufacturerName)
.Fields(fs => fs.Keyword(ss => ss.Name("manufacturer"))
.TokenCount(t => t.Name("MasterProductId")
.Analyzer("my_analyzer")
)
)
.Fielddata())
//.Completion(cm=>cm.Analyzer("my_analyser")
)
)
);
return indexDescriptor;
}
过滤器的顺序很重要!
您正在应用小写字母,然后是词干分析器(滚雪球),然后是同义词。您的同义词包含大写字母,但在应用它们时,小写字母已经出现。最好先应用小写字母,以确保大小写不会影响同义词的匹配,但在这种情况下,您的替换词不应该大写。
不应在同义词之前应用词干分析器(除非您知道自己在做什么,并且正在比较 post-词干提取词)。我相信,雪球会将 'iphone' 转变为 'iphon',因此这是您 运行 遇到麻烦的另一个领域。
"lowercase",
"my_synonym",
"my_stop",
"my_snowball",
(别忘了去掉同义词的大写字母)