如何使用带有function_score标记的过滤器

时间:2015-03-23 14:07:36

标签: elasticsearch

例如,我在下面定义了映射。

  "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,还是有其他方法可以进行过滤?

感谢您的帮助。

1 个答案:

答案 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"
         }
      }
  }