我使用 NEST API 创建了一个带有ElasticSearch
的自动完成过滤器。我似乎无法让木匠这个词起作用。
所以基本上,如果我搜索类似Transhex
的东西,我也希望能够返回Trans Hex
我的索引如下所示...我认为单词分隔符过滤器可能是错误的。 另外,我遵循了以下文章链接。他们使用低级 API,因此我使用 NEST API 可能完全错误
var response = this.Client.CreateIndex(
"company-index",
index => index.Mappings(
ms => ms.Map<CompanyDocument>(m => m.Properties(p => p
.Text(t => t.Name(n => n.CompanyName).Analyzer("auto-complete")
.Fields(ff => ff.Keyword(k => k.Name("keyword")))))))
.Settings(f => f.Analysis(
analysis => analysis
.Analyzers(analyzers => analyzers
.Custom("auto-complete", a => a.Tokenizer("standard").Filters("lowercase", "word-joiner-filter", "auto-complete-filter")))
.TokenFilters(tokenFilter => tokenFilter
.WordDelimiter("word-joiner-filter", t => t.CatenateAll())
.EdgeNGram("auto-complete-filter", t => t.MinGram(3).MaxGram(30))))));
更新 所以我将分析器更新为如下所示,注意到我将分析器从standard
更新为keyword
。
var response = this.Client.CreateIndex(
this.indexName,
index => index.Mappings(
ms => ms.Map<CompanyDocument>(m => m.Properties(p => p
.Text(t => t.Name(n => n.CompanyName).Analyzer("auto-complete")
.Fields(ff => ff.Keyword(k => k.Name("keyword")))))))
.Settings(f => f.Analysis(
analysis => analysis
.Analyzers(analyzers => analyzers
.Custom("auto-complete", a => a.Tokenizer("keyword").Filters("lowercase", "word-joiner-filter", "auto-complete-filter")))
.TokenFilters(tokenFilter => tokenFilter
.WordDelimiter("word-joiner-filter", t => t.CatenateAll())
.EdgeNGram("auto-complete-filter", t => t.MinGram(1).MaxGram(20))))));
结果将如下所示
搜索关键词:完美泳池
结果
- 完美的游泳池->这是顶部的正确池
- 专属泳池
- 完美画家
搜索关键字: 完美泳池或完美泳池
结果
- Perfect Hideaways (Pty( Ltd->这是错误的,我想显示完美的游泳池
- PERFORMANTA APAC PTY LTD
- 完美激光技术(PTY(有限公司
使用关键字标记器。标准分词器会将单词拆分为 2 个标记,然后对其应用过滤器。
更新: 我使用了这样的搜索,似乎还可以。
var searchResult = EsClient.Search<CompanyDocument>(q => q
.Index("test_index")
.Type("companydocument")
.TrackScores(true)
.Query(qq =>
{
QueryContainer queryContainer = null;
queryContainer = qq.QueryString(qs => qs.Fields(fs => fs.Field(f => f.CompanyName)).Query("perfectpools").DefaultOperator(Operator.And).Analyzer("auto-complete"));
return queryContainer;
})
.Sort(sort => sort.Descending(SortSpecialField.Score))
.Take(10)
);