使用字段值的ElasticSearch脚本分数

时间:2014-06-24 13:12:27

标签: elasticsearch

ElasticSearch 1.2.1

我正在尝试使用加权标签查询文档。

curl -X PUT 'http://localhost:9200/test'

curl -X PUT 'http://localhost:9200/test/thing/_mapping' - '{
    "thing": {
        "properties": {
            "tags": {
                "type": "nested",
                "properties": {
                        "name": { "type": "string" },
                        "weight": { "type": "integer" }
                }
            }
        }
    }}'

添加文档:

curl -X PUT 'http://localhost:9200/test/thing/1', -d '{
    "tags": [
        { "name": "a", "weight": 2 }
    ]
}'

现在我正在搜索标记为a的文档,并根据weight提升分数。

注意:要运行这些示例,您必须在ElasticSearch中启用动态脚本:将script.disable_dynamic: false添加到elasticsearch.yml

curl -X GET 'http://localhost:9200/test/thing/_search?pretty' -d '{
    "query": {
        "function_score": {
          "boost_mode": "replace",
          "query": {
            "match_all": {}
          },
          "functions": [
            {
              "filter": {
                "nested": {
                  "path": "tags",
                  "filter": {
                    "term": {
                      "tags.name": "a"
                    }
                  }
                }
              },
              "script_score": {
                "script": "doc.weight.value"
              }
            }
          ]
        }
    }
}'

按预期找到该文档,但得分为0。似乎属性doc.weight是空的。

让我们通过用doc.weight.empty ? 50 : 100替换脚本来测试它。点击现在的得分为50,表示字段doc.weight为空。它是发现,因为使用不存在的字段名称(例如doc.foobar)会出错。

背景:match_all部分将被真实查询替换。我想在不匹配标签之前使用标签来提升与标签匹配的结果。

我错过了什么?

0 个答案:

没有答案