【问题标题】:Elasticsearch mapping config file boost fieldElasticsearch 映射配置文件 boost 字段
【发布时间】:2012-09-25 20:32:41
【问题描述】:

我是搜索新手,无法解释有关在映射中提升字段的文档。

我想实现一个简单的提升,其中某些文章的标题比与文章关联的标签更重要。

这是对配置的尝试,我已将其放入 config/[index_name]/[some_name].json:

{
    "[type]": {
        "properties": {
            "_boost": {
                "name": "title",
                "null_value": 2.0
            }
            "title": {
                "type": "string"
            }
        }
    }
}

我可以判断该文件正在被读取,因为之前对该文件的尝试出现了错误消息。我也一直在删除索引并在尝试之间重新创建它,以便它使用此映射。

这行得通吗?它没有给出任何错误消息,但我无法判断 _search 或 get _mapping API 调用的输出是否有任何提升。

这是 _mapping 调用的结果:

{
    "[type]" : {
        "properties" : {
            "title" : {
                "type" : "string"
            }
            "tags": {
                "type" : "string"
            }
        }
    }
}

【问题讨论】:

    标签: search elasticsearch


    【解决方案1】:

    查看boost field documentation 中的示例。

    boost 字段映射(应用于根对象)允许定义 一个提升字段映射,其内容将控制提升级别 文件

    以下映射定义了一个名为 _boost 的字段。如果 _boost 字段本身存在于索引的 JSON 文档中,则其值将控制索引文档的提升级别。

    {
        "tweet" : {
            "_boost" : {"name" : "_boost", "null_value" : 1.0}
        }
    }
    

    没什么特别的,这个例子只是告诉 elasticsearch 考虑 _boost 字段,并在不存在时给它一个默认的 1.0 值。但是您正在为特定文档定义提升:这意味着当文档与查询匹配时,其分数将根据您应用于root object_boost 字段映射来提升。这与字段级别的提升没有任何关系。

    通过您的映射,您是说title 字段的内容应用作_boost,并且您提供的默认_boost 值为2.0

    "_boost": {
        "name": "title",
        "null_value": 2.0
    }
    

    这没有意义,因为标题包含文本,而且我猜也不是你想要的。

    有多种方法可以更加重视title 字段上的匹配。

    据我从文档中了解到,您可以像这样在映射中执行此操作:

    {
        "[type]" : {
            "properties" : {
                "title" : {
                    "type" : "string",
                    "boost" : 2.0
                }
                "tags": {
                    "type" : "string"
                }
            }
        }
    }
    

    老实说,我没有尝试过,也从未使用过它,但是 lucene 确实允许您在索引时指定每个字段的提升。提升成为该领域规范的一部分,并在该特定领域存在匹配时考虑在内。所以,这就是你要找的。​​p>

    无论如何,我个人会在查询时间而不是索引时间进行提升,这样您就不需要修改映射,并且可以在不重新索引的情况下更改权重。例如,您可以使用 query string 并搜索不同的字段,为它们赋予不同的权重,如下所示:

    {
        "query_string" : {
            "fields" : ["title^2", "content"],
            "query" : "this AND that OR thus"
        }
    }
    

    您需要考虑到查询字符串查询被解析并允许您使用lucene query syntax

    此外,您可以使用bool query 将不同的查询组合在一起。您可以使用包含 term query 和特定提升的 should 子句来表达标题匹配的提升,如下所示:

    "should" : [
        {
            "term" : { "title" : "your query", "boost" : 2.0 }
        }
    ]
    

    你可以使用任何你想要的查询作为 should 子句。如果您使用术语查询,您需要记住它没有被分析。

    【讨论】:

    • 我读过的其他一些 SO 帖子让我相信索引时间提升会更有效。但是在查询中调整提升设置的能力可能是更好的方法。感谢您的明确解释。
    • 是的,如果你在查询时提升,你会付出一点性能成本。我更新了关于在现场级别提升的问题,因为我抬头一看,它确实按您的预期工作。只需选择您喜欢的时间:索引时间或查询时间。
    • 根据 Clinton Gormley 和 Zachary Tong 的《Elasticsearch:权威指南》一书,不建议使用索引时间提升。例如,如果您需要更改索引时间,就必须重新索引所有文档。此外,如果具有索引时间提升的字段具有多个值,则提升会为每个值乘以自身,从而显着增加该字段的权重,这不是您通常想要的。 reference
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2017-10-13
    • 2017-05-18
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多