如果我具有以下映射:
PUT /book
{
"settings": {},
"mappings": {
"properties": {
"title": {
"type": "text"
},
"author": {
"type": "text"
}
}
}
}
我如何提升特定作者的地位? 对于以下示例:
PUT /book/_doc/1
{
"title": "car parts",
"author": "john smith"
}
PUT /book/_doc/2
{
"title": "car",
"author": "bob bobby"
}
PUT /book/_doc/3
{
"title": "soap",
"author": "sam sammy"
}
PUT /book/_doc/4
{
"title": "car designs",
"author": "joe walker"
}
GET /book/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "car" }},
{ "match": { "title": "parts" }}
]
}
}
}
如何做到这一点,以便我的搜索将在搜索结果顶部显示“乔·沃克”给我的书?
答案 0 :(得分:0)
一种解决方案是利用function_score
。
function_score允许您修改查询检索的文档分数。
根据您的映射尝试运行此查询,例如:
GET book/_search
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"match": {
"title": "car"
}
},
{
"match": {
"title": "parts"
}
}
]
}
},
"functions": [
{
"filter": {
"match": {
"author": "joe walker"
}
},
"weight": 30
}
],
"max_boost": 30,
"score_mode": "max",
"boost_mode": "multiply"
}
}
}
query
中的function_score
与您使用的相同的should
查询。
现在,我们要从查询中获取所有结果,并为joe walker
的书赋予更多权重(增加分数),这意味着其书的优先级高于其他书。
要实现这一点,我们创建了一个函数(在functions
内部),该函数为由joe walker
本书过滤的查询返回的每个文档计算一个新分数。
您可以使用砝码和其他参数。
希望有帮助