Elasticsearch“更喜欢这个”API与more_like_this查询

时间:2013-03-08 18:17:23

标签: json rest elasticsearch

Elasticsearch有两个类似的功能来获取“类似”文档:

"More Like This API"。它给了我类似于给定文件的文件。我不能在更复杂的表达中使用它。

还有"more_like_this" query for use in the Search API我可以在bool或boost表达式中使用它,但我不能给它一个文档的id。我必须提供"like_text"参数。

我有包含标签和内容的文件。有些文件会有好的标签,有些则没有。我希望每次都能使用“类似文档”功能,但会将匹配标记的文档排序为高于具有匹配文本的文档。我的想法是:

{
    "boosting" : {
        "positive" : {
            "more_like_this" : {
                "fields" : ["tag"],
                "id" : "23452",
                "min_term_freq" : 1
            }
        },
        "negative" : {
            "more_like_this" : {
                "fields" : ["tag"],
                "id" : "23452",
            }
        },
        "negative_boost" : 0.2
    }
}

显然这不起作用,因为"id"中没有"more_like_this"。有哪些替代方案?

2 个答案:

答案 0 :(得分:42)

首先介绍一下这个功能及其工作原理。这个想法是你有一个特定的文件,你想要一些与它相似的其他文件。

为了实现这一点,我们需要从当前文档中提取一些内容,并使用它来进行查询以获得类似的内容。我们可以从lucene存储的字段(或者是弹性搜索_source字段,它实际上是lucene中的存储字段)中提取内容,并以某种方式重新分析它或使用术语向量中存储的信息(如果在索引时启用)以获取术语列表我们可以用来查询,而不必重新分析文本。如果术语向量可用,我不确定elasticsearch是否尝试后一种方法。

more like this query允许您提供文字,无论您从何处获取文字。该文本将用于查询您选择的字段并返回类似的文档。该文本不会被完全使用,但会重新分析,并且只保留最多max_query_terms(默认为25)的条款,而这些条款至少包含min_term_freq(最低条款频率,默认值) 2)并记录min_doc_freqmax_doc_freq之间的频率。还有更多参数会影响生成的查询。

more like this api更进了一步,允许提供文档的id,再次提供字段列表。这些字段的内容将从该特定文档中提取,并用于在相同字段上进行更类似的查询。这意味着生成的更像此查询将具有包含先前提取的文本的属性文本,并将在相同的字段上执行。正如你所看到的那样,api执行的更像是这个问题。

让我们说更像这个查询会给你更多的灵活性,因为你可以将它与其他查询结合起来,你可以从你喜欢的任何来源获取文本。 另一方面,更像这样的api暴露了为你做更多工作的常用功能,但有一些限制。

在你的情况下,我会将几个不同的更多像这样的查询组合在一起,这样你就可以利用强大的elasticsearch查询DSL,以不同的方式提升查询等等。缺点是您必须自己提供文本,因为您无法提供文档的ID以从中提取文本。

有不同的方法可以达到你想要的效果。我会使用bool query将两个更像这个查询组合在一个should子句中,并赋予它们不同的权重。我也会改用more like this field query,因为你想一次查询一个字段。

{
    "bool" : {
        "must" : {
          {"match_all" : { }}
        },
        "should" : [
            {
              "more_like_this_field" : {
                "tags" : {
                  "like_text" : "here go the tags extracted from the current document!",
                  "boost" : 2.0
                }
              }
            },
            {
              "more_like_this_field" : {
                "content" : {
                  "like_text" : "here goes the content extracted from the current document!"
                }
              }
            }
        ],
        "minimum_number_should_match" : 1
    }
}

这样至少有一个should子句必须匹配,而且标签上的匹配比内容匹配更重要。

答案 1 :(得分:10)

现在可以使用新的类似语法:

{
    "more_like_this" : {
        "fields" : ["title", "description"],
        "like" : [
        {
            "_index" : "imdb",
            "_type" : "movies",
            "_id" : "1"
        },
        {
            "_index" : "imdb",
            "_type" : "movies",
            "_id" : "2"
        }],
        "min_term_freq" : 1,
        "max_query_terms" : 12
    }
}

见这里:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html