在Elasticsearch中提升/加权查询字词

时间:2019-05-28 20:09:12

标签: elasticsearch elasticsearch-py

我有一些查询(例如“ quick brown fox”),在这里我想对某些术语进行不同的加权。例如,我想给形容词加* 2助推,为名词加* 3助推,给动词加* 1。

目前,我从python API提交给Elasticsearch.search()函数的查询主体如下:

body = {
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": {
            "bool": {
              "should": [
                {
                  "multi_match": {
                    "query": "quick brown fox",
                    "type": "most_fields",
                    "fields": ["title^4", "abstract^2", "content"]
                  }
                },
                {
                  "multi_match": {
                    "query": "fairy tale",
                    "type": "most_fields",
                    "fields": ["type^6", "genre^3"]
                  }
                }
              ]
            }
          },
          "filter": {
            "bool": {
              "must": [
                {
                  "range": {
                    "datetime": {
                      "gte": "2018-01-01T00:00:00",
                      "lte": "2018-12-31T23:59:59",
                    }
                  }
                }
              ],
              "must_not": [
                {
                  "ids": {"type": "books", "values": ["1","2"]}
                },
              ]
            }
          }
        }
      },
      "gauss": {
        "datetime": {
          "scale": "30d",
          "decay": 0.5
        }
      }
    }
  }
}

我发布整个查询只是为了清楚我使用的类型和所需的功能。

我的问题是:我可以做类似"query": "quick^2 brown^2 fox^3"的事情吗?什么是更干净更好的方法?

我已经看到可以在"match"子句中为每个不同的提升查询部分(如here所述)单独设置"multimatch" / "should"子句,但我想知道我是否可以避免这条繁琐的路。似乎在这种情况下,我需要根据要赋予查询字词的提升来修改每个字段的提升,并且我想避免这种不直观且具有欺骗性的查询构造。

0 个答案:

没有答案