Elasticsearch NEST

时间:2014-10-19 17:23:32

标签: c# elasticsearch nest

目前我开始在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)
            )));

2 个答案:

答案 0 :(得分:1)

尝试使用像snowball这样的词干分析器分析您的字段,这样可以尝试将字词缩减为根形式。例如,booksbooking =&gt; bookjumpsjumping =&gt; 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的一些非常好的信息。

答案 1 :(得分:1)

你也可以使用模糊......

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