Elasticsearch“更多类似这样的” API与more_like_this查询(Elasti

2019-07-21 05:37发布

Elasticsearch有两个类似的功能,以实现“相似”的文件:

还有就是“更多类似这样的API” 。 它给了我同样给定的一个文件。 我不能在更复杂的表达式,虽然使用它。

此外还有"more_like_this"查询的搜索API的使用 ,我可以在布尔或助推表达式中使用它,但我不能给它一个文件的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" 。 有什么选择?

Answer 1:

首先关于更多像这样的功能和工作原理都有点介绍。 我们的想法是,你有一个特定的文件,你想有一些别人认为是类似的。

为了实现这一点,我们需要提取一些内容超出了本文的并用它来进行查询,以获得类似的报告。 我们可以从中提取了Lucene存储领域的内容(或elasticsearch _source领域,这实际上是在Lucene的存储域)并以某种方式重新分析或使用存储在项向量的信息(如果在索引启用),以获得术语列表我们可以用它来查询,而不必重新分析文本。 我不知道elasticsearch是否尝试后一种方法,如果长期载体是可获得虽然。

在这样的查询更可以让你提供一个文本,无论你来自哪里,得到它的。 该文本将被用于查询您选择并得到类似的文件中的字段。 文本将不被完全使用,但重新分析,并且最多只有max_query_terms (默认为25)将被保留,出具有至少所提供的术语的min_term_freq (最小术语频率,默认2)之间文档频率min_doc_freqmax_doc_freq 。 还有更多的参数也可以影响生成的查询。

在这样的API更进了一步,允许提供一个文件的ID,并再次字段列表。 这些字段的内容将来自特定文件中提取,并用来制造更喜欢在同一个领域的这个查询。 这意味着,所生成的多个这样的查询将具有含有先前提取的文本的属性文本和将在相同的字段来执行。 正如你可以看到更多的类似这样的API执行更像是引擎盖下此查询。

比方说,更像是这个查询为您提供了更大的灵活性,因为你可以与其他查询组合它,你可以从任何你喜欢的源文本。 在另一方面这样的API更暴露了常见的功能为你做,但有一些限制更多的工作。

在你的情况我将结合几个不同的多个这样的查询一起,这样就可以利用强大的elasticsearch查询的DSL,提高查询不同等等。 缺点是,你必须自己提供的文本,因为你不能提供有关文件,从提取它的ID。

有不同的方式来实现你想要什么。 我会用一个布尔查询结合了两个这样的查询中应该条款,给他们一个不同的权重。 我也将使用类似这样的领域查询更多替代,因为你希望一次查询的单个字段。

{
    "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
    }
}

这样的条款应该必须匹配至少一个,并在标签上一场比赛是比内容的比赛更重要。



Answer 2:

这是现在能够与新语法:

{
    "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



文章来源: Elasticsearch “More Like This” API vs. more_like_this query