短语建议器的弹性嵌套 token_limit

Elastic nest token_limit for phrase suggester

最新的nest客户端好像不支持token_limit phrase suggester的参数?如何扩展 NEST 以添加它而无需创建原始查询?

短语建议器缺少最新的 NEST 客户端 token_limit;我会打开一个 PR 来添加它。

与此同时,您可以通过从 PhraseSuggesterDescriptor<T> 派生并在接口上实现令牌限制来支持它并仍然使用流畅的 lambda API

private static void Main()
{
    var client = new ElasticClient();

    var searchResponse = client.Search<Question>(s => s
        .Size(0)
        .Suggest(su => su
            .Phrase("suggest_phrase", p => new MyPhraseSuggesterDescriptor<Question>()
                .TokenLimit(5)
                .Field(f => f.Title)
                .Highlight(h => h
                    .PreTag("<em>")
                    .PostTag("</em>")
                )
                .Text("dotnot entrity framework")
            )
        )
    );
}

public interface IMyPhraseSuggester : IPhraseSuggester
{
    [PropertyName("token_limit")]
    int? TokenLimit { get; set; }
}

public class MyPhraseSuggesterDescriptor<T> : PhraseSuggesterDescriptor<T>, IMyPhraseSuggester where T : class 
{
    int? IMyPhraseSuggester.TokenLimit { get; set; }

    public MyPhraseSuggesterDescriptor<T> TokenLimit(int tokenLimit)
    {
        ((IMyPhraseSuggester)this).TokenLimit = tokenLimit;
        return this;
    }
}

序列化为

{
  "size": 0,
  "suggest": {
    "suggest_phrase": {
      "text": "dotnot entrity framework",
      "phrase": {
        "field": "title",
        "highlight": {
          "pre_tag": "<em>",
          "post_tag": "</em>"
        },
        "token_limit": 5
      }
    }
  }
}

请注意,TokenLimit() 方法调用在任何其他调用之前进行,因为其他调用将 return PhraseSuggesterDescriptor<T> 而不是 MyPhraseSuggesterDescriptor<T>。如果你愿意,你 可以 继续并在 MyPhraseSuggesterDescriptor<T> 上重新定义 IPhraseSuggester 的所有属性,以避免这个 API 怪癖,但这可能更比目前解决它所付出的努力更值得:)