排名特征查询
编辑排名特征查询编辑
根据 rank_feature
或 rank_features
字段的数值,提升文档的 相关性评分。
rank_feature
查询通常用于 bool
查询的 should
子句中,以便其相关性评分被添加到 bool
查询中的其他评分。
对于 rank_feature
或 rank_features
字段,如果将 positive_score_impact
设置为 false
,我们建议参与查询的每个文档都具有此字段的值。否则,如果在 should 子句中使用 rank_feature
查询,它不会为缺少值的文档添加任何评分,但会为包含特征的文档添加一些提升。这与我们想要的结果相反 - 因为我们认为这些特征是负面的,我们希望将包含它们的文档排名低于缺少它们的文档。
与 function_score
查询或其他更改 相关性评分 的方法不同,rank_feature
查询在 track_total_hits
参数 不 为 true
时,会有效地跳过非竞争性命中。这可以显着提高查询速度。
排名特征函数编辑
为了根据排名特征字段计算相关性评分,rank_feature
查询支持以下数学函数
如果您不知道从哪里开始,我们建议使用 saturation
函数。如果没有提供函数,rank_feature
查询默认使用 saturation
函数。
示例请求编辑
索引设置编辑
要使用 rank_feature
查询,您的索引必须包含 rank_feature
或 rank_features
字段映射。要查看如何为 rank_feature
查询设置索引,请尝试以下示例。
创建一个名为 test
的索引,并使用以下字段映射
-
pagerank
,一个rank_feature
字段,用于衡量网站的重要性 -
url_length
,一个rank_feature
字段,包含网站 URL 的长度。在本例中,较长的 URL 与相关性呈负相关,由positive_score_impact
值为false
表示。 -
topics
,一个rank_features
字段,包含主题列表以及每个文档与该主题的关联程度。
response = client.indices.create( index: 'test', body: { mappings: { properties: { pagerank: { type: 'rank_feature' }, url_length: { type: 'rank_feature', positive_score_impact: false }, topics: { type: 'rank_features' } } } } ) puts response
PUT /test { "mappings": { "properties": { "pagerank": { "type": "rank_feature" }, "url_length": { "type": "rank_feature", "positive_score_impact": false }, "topics": { "type": "rank_features" } } } }
将多个文档索引到 test
索引中。
response = client.index( index: 'test', id: 1, refresh: true, body: { url: 'https://en.wikipedia.org/wiki/2016_Summer_Olympics', content: 'Rio 2016', pagerank: 50.3, url_length: 42, topics: { sports: 50, brazil: 30 } } ) puts response response = client.index( index: 'test', id: 2, refresh: true, body: { url: 'https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix', content: 'Formula One motor race held on 13 November 2016', pagerank: 50.3, url_length: 47, topics: { sports: 35, "formula one": 65, brazil: 20 } } ) puts response response = client.index( index: 'test', id: 3, refresh: true, body: { url: 'https://en.wikipedia.org/wiki/Deadpool_(film)', content: 'Deadpool is a 2016 American superhero film', pagerank: 50.3, url_length: 37, topics: { movies: 60, "super hero": 65 } } ) puts response
PUT /test/_doc/1?refresh { "url": "https://en.wikipedia.org/wiki/2016_Summer_Olympics", "content": "Rio 2016", "pagerank": 50.3, "url_length": 42, "topics": { "sports": 50, "brazil": 30 } } PUT /test/_doc/2?refresh { "url": "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix", "content": "Formula One motor race held on 13 November 2016", "pagerank": 50.3, "url_length": 47, "topics": { "sports": 35, "formula one": 65, "brazil": 20 } } PUT /test/_doc/3?refresh { "url": "https://en.wikipedia.org/wiki/Deadpool_(film)", "content": "Deadpool is a 2016 American superhero film", "pagerank": 50.3, "url_length": 37, "topics": { "movies": 60, "super hero": 65 } }
示例查询编辑
以下查询搜索 2016
,并根据 pagerank
、url_length
和 sports
主题提升相关性评分。
GET /test/_search { "query": { "bool": { "must": [ { "match": { "content": "2016" } } ], "should": [ { "rank_feature": { "field": "pagerank" } }, { "rank_feature": { "field": "url_length", "boost": 0.1 } }, { "rank_feature": { "field": "topics.sports", "boost": 0.4 } } ] } } }
rank_feature
的顶级参数编辑
-
field
- (必需,字符串)
rank_feature
或rank_features
字段,用于提升 相关性评分。 -
boost
-
(可选,浮点数) 用于降低或提高 相关性评分 的浮点数。默认值为
1.0
。提升值相对于默认值
1.0
。提升值在0
和1.0
之间会降低相关性评分。大于1.0
的值会提高相关性评分。 -
saturation
-
(可选,函数对象) 饱和度函数,用于根据排名特征
field
的值提升 相关性评分。如果没有提供函数,rank_feature
查询默认使用saturation
函数。有关更多信息,请参见 饱和度。只能提供一个函数
saturation
、log
、sigmoid
或linear
。 -
log
-
(可选,函数对象) 对数函数,用于根据排名特征
field
的值提升 相关性评分。有关更多信息,请参见 对数。只能提供一个函数
saturation
、log
、sigmoid
或linear
。 -
sigmoid
-
(可选,函数对象) S 型函数,用于根据排名特征
field
的值提升 相关性评分。有关更多信息,请参见 S 型函数。只能提供一个函数
saturation
、log
、sigmoid
或linear
。 -
linear
-
(可选,函数对象) 线性函数,用于根据排名特征
field
的值提升 相关性评分。有关更多信息,请参见 线性。只能提供一个函数
saturation
、log
、sigmoid
或linear
。
备注编辑
饱和度编辑
saturation
函数给出的评分等于 S / (S + pivot)
,其中 S
是排名特征字段的值,pivot
是可配置的枢轴值,因此如果 S
小于枢轴,则结果将小于 0.5
,否则大于 0.5
。评分始终为 (0,1)
。
如果排名特征具有负面评分影响,则该函数将计算为 pivot / (S + pivot)
,当 S
增加时,该函数会减小。
GET /test/_search { "query": { "rank_feature": { "field": "pagerank", "saturation": { "pivot": 8 } } } }
如果没有提供 pivot
值,Elasticsearch 会计算一个默认值,该值等于索引中所有排名特征值的近似几何平均值。如果您没有机会训练一个好的枢轴值,我们建议使用此默认值。
GET /test/_search { "query": { "rank_feature": { "field": "pagerank", "saturation": {} } } }
对数编辑
log
函数给出的评分等于 log(scaling_factor + S)
,其中 S
是排名特征字段的值,scaling_factor
是可配置的缩放因子。评分是无界的。
此函数仅支持具有正面评分影响的排名特征。
GET /test/_search { "query": { "rank_feature": { "field": "pagerank", "log": { "scaling_factor": 4 } } } }
S 型函数编辑
sigmoid
函数是 saturation
的扩展,它添加了一个可配置的指数。评分计算为 S^exp^ / (S^exp^ + pivot^exp^)
。与 saturation
函数一样,pivot
是给出 0.5
评分的 S
值,评分为 (0,1)
。
exponent
必须为正数,通常在 [0.5, 1]
范围内。应通过训练计算一个好的值。如果您没有机会这样做,我们建议您改用 saturation
函数。
GET /test/_search { "query": { "rank_feature": { "field": "pagerank", "sigmoid": { "pivot": 7, "exponent": 0.6 } } } }
线性编辑
linear
函数是最简单的函数,它给出的评分等于 S
的索引值,其中 S
是排名特征字段的值。如果排名特征字段的索引使用 "positive_score_impact": true
,则其索引值等于 S
,并四舍五入以仅保留 9 位有效位以进行精度控制。如果排名特征字段的索引使用 "positive_score_impact": false
,则其索引值等于 1/S
,并四舍五入以仅保留 9 位有效位以进行精度控制。
GET /test/_search { "query": { "rank_feature": { "field": "pagerank", "linear": {} } } }