Проблема синонимов Elasticsearch - PullRequest
       12

Проблема синонимов Elasticsearch

0 голосов
/ 18 сентября 2018

Я смотрел на другие вопросы, связанные с этой проблемой, но, похоже, это не помогло.

Мне нужно изменить ввод "i phone" или "i Phone" назапрос «iPhone» в Elasticsearch.

Как вы можете видеть, я перепробовал почти все, что только мог придумать, включая просто «phone => iPhone» и оставив там «i», чтобы побыть там и, возможно, добавитьэто к стоп-словам.

Я пытался использовать «простой», «ключевое слово», «стандартный» и «пробел» для моего пользовательского анализатора.

Может кто-нибудь заметить, где я ошибся, это последняя проблема, прежде чем я смогу закончить свой проект, чтобы он был оценен.Спасибо

PS Бонусные баллы, если вы включите, как я могу сделать автоматическое предложение на входах, спасибо

Ниже мой код

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

1 Ответ

0 голосов
/ 18 сентября 2018

Порядок ваших фильтров имеет значение!

Вы применяете строчные буквы, затем стеммер (снежный ком), а затем синонимы.Вы синонимы содержат заглавные буквы, но к моменту их применения строчные буквы уже произошли.Рекомендуется сначала применять нижний регистр, чтобы убедиться, что регистр не влияет на совпадение синонимов, но ваши замены в этом случае не должны иметь заглавных букв.(если вы не знаете, что делаете, и не сравниваете термины, принятые после принятия решения).Снежок, я полагаю, превратит «iphone» в «iphon», так что это еще одна область, в которой у вас возникают проблемы.

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

(И не забудьте удалить заглавные буквы из ваших синонимов)

...