当前位置: 首页 >> 国内时事 >> 大便干燥,用Python完成ElasticSearch function_score查询(一),贵阳房价 >> 正文

大便干燥,用Python完成ElasticSearch function_score查询(一),贵阳房价

2019年04月06日 04:23:54     作者:admin     分类:国内时事     阅读次数:164    

什么是function_score

function_score查询是处理分值核算进程的终极东西。它让你可以对一切匹配了主查询的每份文档调用一个函数来调整乃至是彻底替换原本的_score。

实际上,你可以经过设置过滤器来将查询得到的成果分红若干个子集,然后对每个子集运用不同的函数。这样你就可以一起得益于:高效的分值核算以及可以缓存的过滤器。

它具有几种预先界说好了的函数:

  • weight 对每份文档适用一个简略的提高,且该提高不会被归约:当weight为2时,成果为2 * _score。
  • field_value_factor 运用文档中某个字段的值来改动_score,比方将受欢迎程度或许投票数量考虑在内。
  • random_score 运用一致性随机分值核算来对每个用户选用不同的成果排序方法,对相同用户依然运用相同的排序方法。
  • 衰减函数(Decay Function)-(linear,exp,gauss) 将像publish_date,geo_location或许price这类起浮值考虑到_score中,偏好最近发布的文档,邻近于某个地理位置(译注:其间的某个字段)的文档或许价格(译注:其间的某个字段)接近某一点的文档。
  • script_score 运用自界说的脚原本彻底操控分值核算逻辑。假如你需求以上预界说函数之外的功用,可以根据需求经过脚本进行完结。

没有function_score查询的话,咱们或许就不能将全文查找得到分值和近因进行结合了愿望射雕。咱们女社长将不得不根据_sco弯刀残魂re或许date进行排序;不管选用哪一种都会抹去另一种的影响。function_score查询让咱们可以将两者交融在一起:依然经过全文相关度排序,可是给新近发布的文档,或许盛行的文档,或许契合用户价格期望的文档额定的权重。你可以幻想,一个具有一切这些功用的查询看起来会适当杂乱。咱们从一个简略的比如开端,按部就班地对它进行介绍。

怎么运用function_score

假定咱们有一个博客网站让用户投票挑选他们喜爱的文章。咱们期望让人气高的文章出现在成果列表的头部,可是首要的排序根据依然是全文查找分值。咱们可以经过保存每篇文章的真紧投票数量来完结。

# 1、新建一个索引映射:兰令鸟

class Post(DocType)大便枯燥,用Python完结ElasticSearch function_score查询(一),贵阳房价:

title = String()

content = Text()

votes = Integer()

created_at = Date()

class Meta:

index = 'blogposts'

type = 'post'

Post.init()

# 2、添加测试数据

def add_post(id_, title, content):

post = Post(meta={'id': id_})

po渡辰意迟生st.title = title

pos大便枯燥,用Python完结ElasticSearch function_score查询(一),贵阳房价t.content = content

post.votes = random.randint(0, 100)

post.save()

# 3、初始化数据

def init_data():

add_post(1, 'Python is good', 'Python is good')

add_post(2whc减速机, 'Python is beautiful', 'Python is beautiful')

add_post(3, 'Python is nice', 'Python is nice')

add_post(4, 'Today is good day', 'Today is good day')

add_post(5, 'Today is nice day', 'Today is nice day')

add_pos大便枯燥,用Python完结ElasticSearch function_score查询(一),贵阳房价t(6, 'The key aspect in promoting', 'The key aspect in promoting')

add_post(7, 'Just a month after we st大便枯燥,用Python完结ElasticSearch function_score查询(一),贵阳房价arted', 'Just a month after we started working on reddit')

add_post(8, "If I can'无面鬼叔t hear your heartbeat", "If I can't hear your heartbeat, you're too far away.")

add_post(9, 'No Country for Old Men', 'No Country for Old Men')

add_post(10, 'Django is web framework', 'Django is python lib')

field_value_factor

运用field_value_factor函数的f葛平是哪里人unction_score查询将投票数和全文相关度分值结合起来:

q = query.Q(

'function_score',

query=query.Q("multi_match", query='python', fields=['title', 'content']),

functions=[

query.SF('field_value_factor', field='votes')

]

)

s = Post.search()

s = s.query(q)

response = s.execute()

for h in response:

p大便枯燥,用Python完结ElasticSearch function_score查询(一),贵阳房价rint(h.title)

"""

Out阿福宝盒:

Python is nice

Python is good

Python is beautiful

Django is web framework

"""

用Python完结ElasticSearch function_score查询(一)

function_score查询会包括主查询(Main Query)和期望运用的函数。先会履行主查询,然后再为匹配的文档调用相应的函数。每罪恶骑士份文档中都必须有一个votes字段用来确保function_score可以起作用。

在前面的比如中,每份文档的终究_score会经过下面的方法改动:

new_score = old_score * number_of_votes

它得到的成果并不好。全文查找的_score一般会在0到10之间。而从下图咱们可以发现,具有10票以上的文章的分值大大超过了这个规模,而没有被投票的文章的分值会被重置为0。

用Python完结ElasticSearch function_score查询(一)

modifier

为了让votes值对终究分值的影响更平缓,咱们可以运用modifier。换言之,咱们需求让头几票的作用更显着,其生产队里养了一群小鸭子后的票的影响逐步减小。0票和1票的差异应该比10票和11票的差异要大的多。

一个用于此场景的典型modifier是log1p,它将公式改成这样:

new_score = old_score * log(1 + number_of_votes)

log函数将votes字段的作用减缓了,其作用相似下面的曲线:

运用了modifier参数的恳求如下:

q = query.Q(

'function_score',

query=query.Q("multi_match", query='python', fields=['title', 'content']),

functions=[

qu三国之常胜侯erm66翔龙y.SF('field_value_factor', field='votes', modifier='log1p')

]

)

可用的modifiers有:none(默认值),log,log1p,log2p,ln,ln1p,ln2p,square,sqrt以及reciprocal。

factor

可以经过将votes字段的值乘以某个数值来添加该字段的影响力,这个数值被称为factor:

q = query.Q(

'function_score',

query=query.Q("multi_match", query='python', fields=['title', '马紫菜content']),

functions=[

query.SF('field_value_factor', field='votes', modifier='log1p', factor=2)

]

)

添加了factor将公式修改成这样:

new_score = old_score log(1 + factor number_of_votes)

当factor大于1时,会添加其影响力,而小于大盗无痕1的factor则相应减小了其影响力,如下图所示:

boost_mode

将全文查找的相关度分值乘以field_value_factor函数的成果,对终究分值的影响或许太大了。经过boost_mode参秦昌政数,咱们可以操控函数的成果应该怎么与_score结合在一起,该参数承受下面的值:

假如咱们是经过将函马恩信数成果累加来得到_score,其影响会小的多,特别是当咱们运用了一个较低的factor时:

q = query.Q(

'function_score',

query=query.Q("multi_match", query='python', fields=['title', 'content']),

functions=[

query.SF('field_value_factor', field='votes', modifier='log1p', factor=0.1)

],

score_mode="sum"

)

上述恳求的公式如下所示:

new_sc秦家有兽ore = old_score + log(1 + 0.1大便枯燥,用Python完结ElasticSearch function_score查询(一),贵阳房价 * number_of_votes)

max_boost

终究,咱们可以经过拟定max_boost参数来约束函数的最大影响:

q = query.Q(

'function_score',

query=query.Q("multi_match", query='python', fields=['title', 'content']),

functions=[

query.SF('field_value_factor', field='votes', modifier='log1p', factor=0.1)

],

score_mode="sum",

max_boost=1.5

)

不管field_value_factor函数大便枯燥,用Python完结ElasticSearch function_score查询(一),贵阳房价的成果是多少,它绝不会大于1.5。

max_boost仅仅对函数的成果有所约束,并不是终究的_score。
除非特别注明,本文『大便干燥,用Python完成ElasticSearch function_score查询(一),贵阳房价』来源于互联网、微信平台、QQ空间以及其它朋友推荐等,非本站作者原创。 本站作者admin不对本文拥有版权,如有侵犯,请投诉。我们会在72小时内删除。 但烦请转载时请标明出处:“本文转载于『卡通池-孩童的天空,有趣的视角-给你带来不同的新闻』,原文地址:http://www.katokoichi.com/articles/1508.html