Elasticsearch"更喜欢这个"API与more_like_this查询

Ant*_*łka 21 rest json elasticsearch

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

"更喜欢这个API".它给了我类似于给定文件的文件.我不能在更复杂的表达中使用它.

还有"more_like_this"在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
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这并不工作,因为没有"id""more_like_this".有哪些替代方案?

jav*_*nna 45

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

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

这样的查询更可以让你提供一个文本,无论你来自哪里,得到它的.该文本将用于查询您选择的字段并返回类似的文档.该文本将不会被完全使用,但会重新分析,并且只保留最多max_query_terms(默认为25)的条款,这些条款至少包含所提供的条款min_term_freq(最短期限频率,默认为2),文档频率在min_doc_freq和之间max_doc_freq.还有更多参数可以影响生成的查询.

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

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

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

有不同的方法来实现你想要的.我会使用bool查询将两个更像这个查询组合在一个should子句中,并赋予它们不同的权重.我也会使用更像这个字段的查询,因为你想一次查询一个字段.

{
    "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
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Dat*_*eek 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
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html

  • 在最近的 ElasticSearch 版本中,“docs”关键字已被弃用,取而代之的是“like”。 (2认同)