使用Query_String进行弹性搜索Function_Score查询

时间:2014-03-16 09:58:12

标签: python elasticsearch pyelasticsearch

我使用代码使用弹性搜索进行搜索:

es.search(index="article-index", fields="url", body={
  "query": {
    "query_string": {
      "query": "keywordstr",
      "fields": [
        "text",
        "title",
        "tags",
        "domain"
      ]
    }
  }
})

现在我想在搜索评分中插入另一个参数 - " recencyboost"。

我被告知function_score应该解决问题

res = es.search(index="article-index", fields="url", body={
  "query": {
    "function_score": {
      "functions": {
        "DECAY_FUNCTION": {
          "recencyboost": {
            "origin": "0",
            "scale": "20"
          }
        }
      },
      "query": {
        {
          "query_string": {
            "query": keywordstr
          }
        }
      },
      "score_mode": "multiply"
    }
  }
})

它给出了错误,即字典{"query_string": {"query": keywordstr}}不可用。

1)如何修复错误?

2)如何改变衰减函数,使其对较高的近因增强提供更高的权重?

2 个答案:

答案 0 :(得分:2)

您的搜索中似乎有一个额外的query(总共三个),这会给您一个不受欢迎的顶级。您需要删除顶级query并将其替换为function_score作为顶级密钥。

res = es.search(index="article-index", fields="url", body={"function_score": {
    "query": {
        { "query_string": {"query": keywordstr} }
    },
    "functions": {
        "DECAY_FUNCTION": {
            "recencyboost": {
                "origin": "0",
                "scale": "20"
            }
        }
    },
    "score_mode": "multiply"
})

注意:score_mode默认为"multiply",未使用的boost_mode也是如此,因此不需要提供它。

答案 1 :(得分:1)

你不能使用字典作为字典中的键。您正在以下代码段中执行此操作:

"query": {
    {"query_string": {"query": keywordstr}}
},

以下应该可以正常工作

"query": {
    "query_string": {"query": keywordstr}
},