json - Elasticsearch "More Like This"API 与 more_like_this 查询

标签 json rest elasticsearch

Elasticsearch 有两个相似的特性来获取“相似”的文档:

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

还有 "more_like_this" query for use in the Search API我可以在 bool 或 boosting 表达式中使用它,但我不能给它一个文档的 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
    }
}

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

最佳答案

首先简单介绍一下这个功能及其工作原理。这个想法是您有一个特定的文档,并且您想要其他一些与它类似的文档。

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

more like this query允许您提供文本,无论您是从哪里获得的。该文本将用于查询您选择的字段并取回类似的文档。文本不会被完全使用,但会被重新分析,并且在至少具有所提供的 min_term_freq 的术语中,最多只会保留 max_query_terms(默认为 25) (最小词频,默认为 2)和文档频率在 min_doc_freqmax_doc_freq 之间。还有更多参数可以影响生成的查询。

more like this api更进一步,允许提供文档的 ID,并再次提供字段列表。这些字段的内容将从该特定文档中提取,并用于在相同字段上进行更类似的查询。这意味着生成的 more like 此查询将具有包含先前提取的文本的属性文本,并将在相同的字段上执行。如您所见,这个 api 越多,在后台执行的查询就越像。

假设这个查询越像,您的灵 active 就越大,因为您可以将它与其他查询结合起来,并且可以从您喜欢的任何来源获取文本。 另一方面,更像这个 api 公开了为您做更多工作但有一些限制的通用功能。

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

有多种方法可以实现您想要的。我会使用 bool query将两个 more like this 查询组合在一个 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 子句必须匹配,标签上的匹配比内容上的匹配更重要。

关于json - Elasticsearch "More Like This"API 与 more_like_this 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300650/

相关文章:

java - Spring REST @RequestBody 总是空的

rest - 无法从同一网络中的另一台计算机访问在我的计算机中运行的 SPRING BOOT 应用程序的 REST API

使用嵌套 function_scores 对 elasticsearch 进行评分

elasticsearch - 在 Elasticsearch 中使用带有bool的query_string查询导致解析异常

javascript - syntaxerror json.parse json 数据第 1 行第 1 列的意外字符

javascript - 处理获取ajax json请求的php

java - 将具有不同键类型的映射序列化为 json

java - 在 com.google.Volley 上覆盖图像解析的最佳方法是什么?

json - 使用 JSON API 表示无资源的聚合数据

elasticsearch - Spring 数据 Elasticsearch 中的可配置索引名称