您当前的位置:网站首页>principle,用Python完成ElasticSearch function_score查询(一),价值观

principle,用Python完成ElasticSearch function_score查询(一),价值观

2019-04-07 00:43:14 投稿作者:admin 围观人数:229 评论人数:0次

什么是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中,偏好最近发布的文档,邻近于某个地理位置(译注:其间的某个字段)的文档或许价格(译注:其间的principle,用Python完结ElasticSearch function_score查询(一),价值观某个字段)接近某一点的文档。
  • script_score 运用自界说的脚原本彻底操控分值核算逻辑。假如你需求以上预界说函数之外的功用,可以根据需求经过脚本进行完结。

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

怎么运用function_score

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

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

class Post(DocType):

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_})

post.title = title

post.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(2, 'Python is beautiful', 'Python is beautif司隐乐ul')

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_post(6, 'The key aspect in promoting', 'The key aspect in promoting')

add_post(7, 'Just a month after we startprinciple,用Python完结ElasticSearch function_score查询(一),价值观ed', '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 principle,用Python完结ElasticSearch function_score查询(一),价值观for Old Men', 'No Country for Old Men')

恒彩测速add_post(10, 'Django is we打坐b framework', 'Django is python lib')

field_value_factor

运用field_value_factor函数的function_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:

print(h.title)

"""

Out:

Python is nice

Python is good

Python iprinciple,用Python完结ElasticSearch function_score查询(一),价值观s 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=[

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

]

)

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

factor

可以经过将votes字段的值乘以某个数值来添加该字段的影响力,这principle,用Python完结ElasticSearch function_score查询(一),价值观个数值被称为factor:

q = query.Q(

'function_score',

query=qu上海图书馆ery.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_f2016年日历actor函数的成果,对终究分值的影响或许太大了。经过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=principle,用Python完结ElasticSearch function_score查询(一),价值观"sum"

)

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

new_score = old_score + log(1 + 0.1 * number_of_votes)

max_boost

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

q = query.Q(

'function_score',

query=query.Q("multi_match", query='python', fields=['title', 'content'principle,用Python完结ElasticSearch function_score查询(一),价值观]),

functions=[

query.SF('field_va水柔lue_factor', field='votes', modifier='log1p', factor=0.1)

],

score_mode="sum",

max_boost=1.5

)

不管field_value_factor函数的成果是多少,它绝不会大于1.5。

max_boos哈尔滨师范大学阿城学院t仅仅对函数的成果有所约束,并不是终究的_score。
the end
都市男女骚话识别指南