未找到 Elasticsearch NEST Suggester 解析器

Posted

技术标签:

【中文标题】未找到 Elasticsearch NEST Suggester 解析器【英文标题】:Elasticsearch NEST Suggester parser(s) not found 【发布时间】:2019-05-06 14:36:09 【问题描述】:

我正在尝试利用 Elasticsearch 的“Suggester”功能。

使用 Phrase、Term 或 Completion 我总是得到以下错误变化。

unable to parse SuggestionBuilder with name [COMPLETION]: parser not found"
unable to parse SuggestionBuilder with name [TERM]: parser not found"
unable to parse SuggestionBuilder with name [PHRASE]: parser not found"

我尝试了多个 6.x NEST 版本,它们都有相同的问题。 升级到 7.0alpha1 确实会改变错误,但似乎会导致无数其他问题,我宁愿不在生产中使用 alpha 库。

我目前正在学习本教程并将其应用于我现有的代码中:https://github.com/elastic/elasticsearch-net-example/tree/6.x-codecomplete-netcore#part-6-suggestions

当前使用 NEST 6.1

型号:

public class SearchResult 

      public SearchResult()
                
                    TitleSuggest = new CompletionField Input = new List<string>(Title.Split(' '));
                
                public CompletionField TitleSuggest  get; set; 
        //etc
        

索引方法:

public async Task<IActionResult> CreateIndex()
        
            await _searchClient.CreateIndexAsync(SearchIndexName, indexSelector =>
                indexSelector
                    .Mappings(mappingsDescriptor =>
                        mappingsDescriptor.Map<Models.SearchResult>(y => y.AutoMap().Properties(pr=>pr.Completion(c => c.Name(p => p.TitleSuggest)
                        ))))

建议方法:

public async Task<ISearchResponse<SearchResult>> Suggest(string keyword)
        
return await _searchClient.SearchAsync<SearchResult>(
                s =>
                        s.Suggest(ss => ss
                            .Completion("title", cs => cs
                                .Field(f => f.TitleSuggest)
                                .Prefix(keyword)
                                .Fuzzy(f => f
                                    .Fuzziness(Fuzziness.Auto)
                                )
                                .Size(5))

我很难破译错误。 似乎 NEST 库缺少 Suggester 解析器? 任何帮助都会很棒,谢谢!

【问题讨论】:

您运行的是哪个版本的 Elasticsearch? @RussCam 好问题。我们使用的是 6.7.0 版本。我也尝试了使用最新的 NEST 库 6.6.0 的解决方案。同步这些可能是个好主意。 【参考方案1】:

作为后续,@RussCam 回答了我的问题here

我有一个 ConnectionSetting (DefaultFieldNameInferrer) 将我的建议器大写

private IElasticClient ElasticClient(IConfiguration _config, string defaultIndex)

  var settings = new ConnectionSettings(new Uri(_config.GetSection("Search:Url").Value))
    .BasicAuthentication(_config.GetSection("Search:User").Value, _config.GetSection("Search:Password").Value)
    .DefaultIndex(_config.GetSection(defaultIndex).Value);
  //settings.DefaultFieldNameInferrer(p => p.ToUpper(CultureInfo.CurrentCulture));

  //Enable ElasticSearch Debugging
  settings.PrettyJson().DisableDirectStreaming();

  return new ElasticClient(settings);

【讨论】:

【参考方案2】:

试试这个:

var searchResponse = await _searchClient.SearchAsync<SearchResult>(s => s
                .Index(ConfigurationManager.AppSettings.Get("index"))
                .Type(ConfigurationManager.AppSettings.Get("indextype"))
                .Suggest(su => su
                    .Completion("suggest", cs => cs
                        .Size(20)
                        .Field(f => f.TitleSuggest)
                        .Fuzzy(f => f
                                .Fuzziness(Fuzziness.Auto))
                        .Size(5))));

【讨论】:

感谢您的建议,但似乎没有帮助。但是,我发现了一些有趣的信息。我将IndexType 方法调整为不正确的值,它们不会影响返回的错误。这可能在一定程度上证实了我最初的反应,即这是一个更深层次的问题。 JFYI Kartheek,您的个人资料中有拼写错误:“工程师”。

以上是关于未找到 Elasticsearch NEST Suggester 解析器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NEST2 中更新 Elasticsearch 文档

ElasticSearch NEST API 更新值为 null

ElasticSearch NEST 搜索

NEST (ElasticSearch) 将 Highlights 匹配到文档

ElasticSearch NEST笔记

Elasticsearch,如何使 NEST 地图响应类