3

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

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

这是我在 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"
            }
        }
    }
}
4

1 回答 1

10

查看boost field 文档中的示例。

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

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

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

没什么特别的,这个例子只是告诉 elasticsearch 考虑字段,并在不存在时给它_boost一个默认值。1.0但是您正在为特定文档定义提升:这意味着当文档与查询匹配时,它的分数将根据_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 确实允许您在索引时指定每个字段的提升。提升成为该领域规范的一部分,并在该特定领域存在匹配时考虑在内。所以,这就是你要找的。

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

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

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

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

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

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

于 2012-09-26T07:48:31.013 回答