【问题标题】:Elasticsearch NEST弹性搜索巢
【发布时间】:2015-05-06 16:55:56
【问题描述】:

目前我开始为 c#“NEST”使用 Elasticsearch 包装器,并且在编写检查部分相似性的查询时遇到了一些麻烦,例如“book”和“books”,所以当我有一个包含“书”,如果我搜索“书”,它不会找到它: 这是我的代码:

var articles = client.Search<ProductResult>(s => s
        .From(0)
        .Size(1000)
        .MatchAll()
        .Query(q => q.QueryString(d => d
        .Query(query)
            )));

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    尝试使用像 snowball 这样的词干分析器来分析您的字段,它会尽量将单词简化为词根形式。例如,booksbooking => bookjumpsjumping => jump。等等......它背后的算法并不完美,并且会在不规则的单词/复数形式上出错,但在大多数情况下它工作得很好(在大多数欧洲语言上)。

    您可以在最初创建索引时应用不同的分析器,或者使用更新映射 API 在现有索引上应用。无论哪种方式,您都必须重新索引我们的文档以应用新的分析。

    使用 NEST 创建索引示例:

    client.CreateIndex("yourindex", c => c
        ...
        .AddMapping<YourType>(m => m
            .MapFromAttributes()
            .Properties(ps => ps
                .String(s => s.Name("fieldname").Analyzer("snowball"))
                ...
            )
        )   
    );
    

    更新映射示例:

    client.Map<YourType>(m => m
        .MapFromAttributes()
        .Index("yourindex")
        .Properties(ps => ps
            .String(s => s.Name("fieldname").Analyzer("snowball"))
            ...
        )
    );
    

    这里有一些关于 algorithmic stemmers in The Definitive Guide 的非常棒的信息。

    【讨论】:

    • 非常感谢您对@GregMarzouka 的回复,我会尝试一下,看看我能拥有什么。如果您有任何关于使用 NEST 的更详细资源,我将不胜感激与我分享,因为我发现他们网站上提供的文档还不够。
    【解决方案2】:

    你也可以使用 Fuzzy...

    var articles = client.Search<ProductResult>(s => s
                .From(0)
                .Size(1000)
                .Query(q => q.(d => d
                    .Fuzzy(fz => fz.OnField("field").Value("book").MaxExpansions(2))
                    ));
    

    【讨论】:

    • 谢谢,我试试这个@dzomba
    • MaxExpansion 值可以更改...值越大表示数据库值和输入之间的差异越大。做一些测试
    • 您也可以使用带有通配符的 queryString,您将搜索如下内容:“book*”
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2021-11-23
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多