代码之家  ›  专栏  ›  技术社区  ›  Imran Azad

短语提示器的弹性nest token\u限制

  •  0
  • Imran Azad  · 技术社区  · 8 年前

    似乎最新的nest客户端不支持 token_limit 短语提示器的参数?如何扩展NEST来添加它,而不必创建原始查询?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Russ Cam    8 年前

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

    同时,您可以通过从 PhraseSuggesterDescriptor<T> 以及在接口上实现令牌限制

    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() 方法调用在任何其他调用之前进行,因为其他调用将返回 短语建议描述符(&L);T> 而不是 MyPhraseSuggesterDescriptor<T> . 你 能够 继续并重新定义的所有属性 IPhraseSuggester 在…上 MyPhraseSuggesterDescriptor<T> 如果您愿意,可以避免这种API怪癖,但这可能需要付出更多的努力,而不是暂时解决它:)