ElasticSearch NEST 自定义单词连接器分析器未返回正确的结果



我使用 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))))));

结果将如下所示

搜索关键词完美泳池

结果

  1. 完美的游泳池->这是顶部的正确池
  2. 专属泳池
  3. 完美画家

搜索关键字: 完美泳池或完美泳池

结果

  1. Perfect Hideaways (Pty( Ltd->这是错误的,我想显示完美的游泳池
  2. PERFORMANTA APAC PTY LTD
  3. 完美激光技术(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)
);

最新更新