ElasticSearch NEST自定义单词joiner Analyzer未返回正确的结果

时间:2018-05-09 09:50:40

标签: elasticsearch nest

我使用NEST API创建了一个带ElasticSearch的自动完成过滤器。我似乎无法得到木工这个词。

所以基本上如果我搜索Transhex这样的东西我也希望能够返回Trans Hex

我的索引如下所示......我认为WordDelimiter过滤器可能有误。 另外,我遵循了以下文章Link。他们使用低级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. 完美泳池 - &gt;这是顶部的正确
  2. 独家泳池
  3. 完美画家
  4. 搜索关键字 perfectpools或PerfectPools

    结果

    1. Perfect Hideaways(Pty)Ltd - &gt;这是错误的我希望展示完美的游泳池
    2. PERFORMANTA APAC PTY LTD
    3. Perfect Laser Technologies(PTY)LTD

1 个答案:

答案 0 :(得分:0)

使用关键字标记生成器。标准的标记器会将单词分成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)
            );