短语建议器

时间:2018-02-23 19:27:07

标签: elasticsearch nest

似乎最新的nest客户端不支持短语建议者的token_limit参数?如何在不必创建原始查询的情况下扩展NEST以添加它?

1 个答案:

答案 0 :(得分:1)

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

与此同时,您可以支持它并仍然使用流畅的lambda API,方法是从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()方法调用是在任何其他调用之前进行的,因为其他调用将返回PhraseSuggesterDescriptor<T>而不是MyPhraseSuggesterDescriptor<T>。如果您愿意,可以继续并重新定义IPhraseSuggesterMyPhraseSuggesterDescriptor<T>的所有属性,以避免这种API怪癖,但这可能比努力解决更多的努力它暂时:)