Nest MultiMatch Field Boost

时间:2016-09-01 16:34:01

标签: elasticsearch nest

我正在尝试在multiMatch搜索中提升某些字段。

查看我看到的文档可以通过执行此操作来创建Field

var titleField = Infer.Field<Page>(p => p.Title, 2);

我无法弄清楚这是如何转化为Fields的。

这样的事情是不对的

var bodyField = Infer.Field<Page>(p => p.Body);
var titleField = Infer.Field<Page>(p => p.Title, 2);
var metaDescriptionField = Infer.Field<Page>(p => p.MetaDescription, 1.5);
var metaKeywordsField = Infer.Field<Page>(p => p.Keywords, 2);

MultiMatchQuery multiMatchQuery = new MultiMatchQuery()
{
    Fields = Infer.Fields<Page>(bodyField, titleField, metaDescriptionField, metaKeywordsField),
            Query = search.Term
};

我是否需要使用

等字段的字符串名称
var titleFieldString = "Title^2";

并将其传递到Infer.Fields

1 个答案:

答案 0 :(得分:6)

您可以使用强类型Infer.Field<T>();存在从FieldFields的隐式转换,并且可以使用.And()添加其他字段。这是一个例子

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

    Fields bodyField = Infer.Field<Page>(p => p.Body);
    var titleField = Infer.Field<Page>(p => p.Title, 2);
    var metaDescriptionField = Infer.Field<Page>(p => p.MetaDescription, 1.5);
    var metaKeywordsField = Infer.Field<Page>(p => p.Keywords, 2);

    var searchRequest = new SearchRequest<Page>()
    {
        Query = new MultiMatchQuery()
        {
            Fields = bodyField
                        .And(titleField)
                        .And(metaDescriptionField)
                        .And(metaKeywordsField),
            Query = "multi match search term"
        }
    };

    client.Search<Page>(searchRequest);
}

public class Page
{
    public string Body { get; set; }
    public string Title { get; set; }
    public string MetaDescription { get; set; }
    public string Keywords { get; set; }
}

这会产生

{
  "query": {
    "multi_match": {
      "query": "multi match search term",
      "fields": [
        "body",
        "title^2",
        "metaDescription^1.5",
        "keywords^2"
      ]
    }
  }
}

您还可以传递Field数组,该数组也隐式转换为Fields

var searchRequest = new SearchRequest<Page>()
{
    Query = new MultiMatchQuery()
    {
        Fields = new[] {
            bodyField,
            titleField,
            metaDescriptionField,
            metaKeywordsField
        },
        Query = "multi match search term"
    }
};

除了传递一个字符串数组

var searchRequest = new SearchRequest<Page>()
{
    Query = new MultiMatchQuery()
    {
        Fields = new[] {
            "body",
            "title^2",
            "metaDescription^1.5",
            "keywords^2"
        },
        Query = "multi match search term"
    }
};