例如,我在下面定义了映射。
"mappings": {
"test_type": {
"properties": {
"itemname": {
"type": "string",
"store":"yes",
"index": "analyzed",
"analyzer": "my_analyzer"
},
"categoryid": {
"type": "long",
"store":"yes"
}
"myrank": {
"type": "long",
"store":"yes"
},
}
}
}
主要是,我想搜索“itemname”字段。 而且我想要像这样自定义得分结果。
{
"query": {
"function_score": {
"boost_mode": "replace",
"score_mode": "multiply",
"functions": [
"script_score": {
"script": "_score * 0.7 + doc[\"myrank\"].value / 100 * 0.3"
}
],
"query": {
"query_string": {
"query": "test",
"default_field": "itemname",
"default_operator": "and"
}
}
}
},
"sort": [
"_score"
]
}
我知道它的效果与我预期的一样。
有时我想使用itemname和categoryid字段进行搜索。 但我不能使用带有function_score的“过滤”标签。 我知道如果我只使用过滤标签,它的工作原理就是这样。
{
"query": {
"filtered": {
"query": {
"query_string": {
"default_field": "itemname",
"query": "*"
}
},
"filter": {
"term": {
"categoryid": "1"
}
}
}
},
"sort": [
"_score"
]
}
我尝试在filter和function_score之间制作多种类型的组合标签,但我无法获得成功。
我的意思是我想制作像这样的SQL的DSL。
SELECT * FROM test_type WHERE itemname LIKE "%xxxx%" AND categoryid = 1 ORDER BY "_score * 0.7 + doc[\"myrank\"].value / 100 * 0.3"
有谁知道我应该使用filter和function_score,还是有其他方法可以进行过滤?
感谢您的帮助。
答案 0 :(得分:0)
你能用这样的过滤器尝试功能得分吗?
{
"query": {
"function_score": {
"boost_mode": "replace",
"score_mode": "multiply",
"functions": [
"filter": { "term": { "categoryid": "1" }},
"script_score": {
"script": "_score * 0.7 + doc[\"myrank\"].value / 100 * 0.3"
}
],
"query": {
"query_string": {
"query": "test",
"default_field": "itemname",
"default_operator": "and"
}
}
}
},
"sort": [
"_score"
]
}
<强>更新强>
如果您使用的是术语,则不应分析字段categoryId 过滤它。更改映射以使其不被分析。
使用过滤后的查询根据categoryId进行过滤。
您可以尝试以下查询吗?
"query":{
"function_score":{
"query":{
"filtered":{
"query":{
"query_string":{
"default_field":"itemname",
"query":"*"
}
},
"filter":{
"term":{
"categoryid":"1"
}
}
}
},
"boost_mode":"replace",
"score_mode":"multiply",
"script_score": {
"script": "_score * 0.7 + doc[\"myrank\"].value / 100 * 0.3"
}
}
}