【问题标题】:Elasticsearch synonym issueElasticsearch 同义词问题
【发布时间】:2019-02-22 13:37:32
【问题描述】:

我已经查看了有关此问题的其他问题,但似乎没有帮助。

我必须更改“i phone”或“i Phone”的输入以在 Elasticsearch 中查询“iPhone”。

如您所见,我已经尝试了几乎所有我能想到的东西,包括简单的“电话 => iPhone”,然后将“i”留在那里闲逛,并可能将其添加到停用词中。

我尝试在我的自定义分析器中使用“simple”、“keyword”、“standard”和“whitespace”。

任何人都可以发现我出错的地方,这是我完成项目之前的最后一个问题,因此不胜感激。谢谢

附:如果您包括我如何对输入进行自动建议,则可以加分,谢谢

下面是我的代码

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;
        }

【问题讨论】:

  • synonym token filter 怎么样?
  • 嗨@cmantas,感谢您的回复。我发现很难将文档中的格式转换为我的 .NET 版本。这不是上面 .TokenFilters 段中的内容吗?还是我只是错过了什么?谢谢

标签: elasticsearch lucene nest


【解决方案1】:

过滤器的顺序很重要!

您正在应用小写字母,然后是词干分析器(雪球),然后是同义词。您的同义词包含大写字母,但在应用它们时,已经发生了小写。首先应用小写字母是个好主意,以确保大小写不会影响同义词的匹配,但在这种情况下,您的替换不应该有大写字母。

不应在同义词之前应用词干(除非您知道自己在做什么,并且正在比较词干后的词)。我相信,Snowball 会将“iphone”转换为“iphon”,所以这是您遇到麻烦的另一个领域。

"lowercase",
"my_synonym",
"my_stop",
"my_snowball",

(别忘了去掉同义词的大写)

【讨论】:

  • 感谢您的评论!我已经按照你的建议做了,可悲的是我仍然遇到同样的困难。我用“i phone => iphone”替换了同义词,并从过滤器中删除了雪球,但无济于事。不幸的是,我也找不到关于此事的很多好的文档。还有什么想法吗? :)
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多