1

我正在尝试按照文档中的描述执行以下操作(目前可能已过时)。

https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping.html

我会将那里描述的场景调整为我想要实现的目标。

假设我们的索引中有两种类型:blog_t1 用于关于主题 1 的博客文章,而 blog_t2 用于关于主题 2 的博客文章。这两种类型都有一个标题字段。

然后,我只想将查询提升应用于 blog_t1 的标题字段。

在以前的 Elasticsearch 版本中,您可以使用 blog_t1.title 和 blog_t2.title 从类型中引用字段。所以提升其中一个就像 blog_t1.title^2 一样简单。

但是从 Elasticsearch 2.x 开始,一些旧的类型支持已被删除(有充分的理由,比如消除歧义)。此处描述了这些更改。

https://www.elastic.co/guide/en/elasticsearch/reference/current/break_20_mapping_changes.html

所以我的问题是,如何在 multi_match 查询中使用 Elasticsearch 2.x 对 blog_t1 类型而不是 blog_t2 进行标题提升?

查询将是这样的,但这显然不起作用,因为type.field不再是一个东西。

GET /my_index/_search
{
  "query": {
    "multi_match": {
      "query": "Hello World",
      "fields": [
        "blog_t1.title^2",
        "blog_*.title",
        "author",
        "content"
      ]
    }
  }
} 

仅供参考,到目前为止,我发现的唯一解决方案是给标题起不同的名称,例如 blog_t1 的 title_boosted 和其他标题的标题,这在使用信息时是有问题的,因为我不能再使用“标题”作为独特的东西。

谢谢。

4

1 回答 1

0

如何为文档类型添加另一个“可选”约束,以便匹配它的文档具有更高的分数(您可以通过提升来调整它),例如:

{
  "query" : {
    "bool" : 
    {
      "must" : 
      [
        {"match" : {"title" : "Hello world"}}
      ],
      "should" : 
      [
        {"match" : {"_type" : "blog_t1"}}
      ]
    }
  }
}

或使用评分函数:

{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": "Hello world"
        }
      },
      "boost_mode": "multiply",
      "functions": [
        {
          "filter": {
            "term": {
              "_type": "blog_t1"
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "term": {
              "_type": "blog_t2"
            }
          },
          "weight": 3
        }
      ]
    }
  }
}
于 2016-02-29T12:54:26.643 回答