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