目前我开始在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)
)));
答案 0 :(得分:1)
尝试使用像snowball
这样的词干分析器分析您的字段,这样可以尝试将字词缩减为根形式。例如,books
和booking
=&gt; book
,jumps
和jumping
=&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))
));