Nest MultiMatch 字段提升

Nest MultiMatch Field Boost

我正在尝试在 multiMatch 搜索中将某些字段提升到其他字段之上。

查看文档,我发现您可以通过执行此操作创建一个 Field with boost

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

你可以使用强类型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"
    }
};