根据弹性搜索中的选定类型提升结果

时间:2016-06-21 07:35:22

标签: elasticsearch filter

我在弹性搜索中索引了不同的类型。 但是,如果我想在某些选定的类型上提高我的结果,那么我该怎么办? 我可以在提升查询中使用类型过滤器,但是类型过滤器只允许在过滤器中使用一种类型。我需要在多种类型的基础上提高结果。

实施例: 我有弹性搜索索引的人物,事件,位置数据,其中人物,位置和事件是我的类型。

我正在搜索关键字'伦敦'在所有类型,但我希望人和事件类型记录比位置提升。

我怎么能实现同样的目标?

2 个答案:

答案 0 :(得分:1)

获得所需功能的一种方法是将查询包装在bool查询中,然后使用should子句,以便提升某些文档

小例子:

POST test/person
{
  "title": "london elise moore"
}

POST test/event
{
  "title" : "london is a great city"
}

没有提升:

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "london"
          }
        }
      ]
    }
  }
}

通过以下回复:

"hits": {
    "total": 2,
    "max_score": 0.2972674,
    "hits": [
      {
        "_index": "test",
        "_type": "person",
        "_id": "AVVx621GYvUb9aQn6r5X",
        "_score": 0.2972674,
        "_source": {
          "title": "london elise moore"
        }
      },
      {
        "_index": "test",
        "_type": "event",
        "_id": "AVVx63LrYvUb9aQn6r5Y",
        "_score": 0.26010898,
        "_source": {
          "title": "london is a great city"
        }
      }
    ]
  }

现在添加了should子句:

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "london"
          }
        }
      ],
      "should": [
        {
          "term": {
            "_type": {
              "value": "event",
              "boost": 2
            }
          }
        }
      ]
    }
  }
}

这回复了以下回复:

"hits": {
    "total": 2,
    "max_score": 1.0326607,
    "hits": [
      {
        "_index": "test",
        "_type": "event",
        "_id": "AVVx63LrYvUb9aQn6r5Y",
        "_score": 1.0326607,
        "_source": {
          "title": "london is a great city"
        }
      },
      {
        "_index": "test",
        "_type": "person",
        "_id": "AVVx621GYvUb9aQn6r5X",
        "_score": 0.04235228,
        "_source": {
          "title": "london elise moore"
        }
      }
    ]
  }

你甚至可以在should子句中省略额外的提升,因为如果should子句匹配它会提升结果:)

希望这有帮助!

答案 1 :(得分:0)

我看到使用它的两种方法,但两者都使用脚本 1.使用排序

POST c1_1/_search
{
  "from": 0,
  "size": 10,
  "sort": [
    {
      "_script": {
        "order": "desc",
        "type": "number",
        "script": "double boost = 1; if(doc['_type'].value == 'Person') { boost *= 2 }; if(doc['_type'].value == 'Event') { boost *= 3}; return _score * boost; ",
        "params": {}
      }
    },
    {
      "_score": {}
    }
  ],
  "query": {
    "bool": {
      "should": [
        {
          "query_string": {
            "query": "*",
            "default_operator": "and"
          }
        }
      ],
      "minimum_should_match": "1"
    }
  }
}

第二个选项使用功能得分。

POST c1_1/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "query_string": {
                "query": "*",
                "default_operator": "and"
              }
            }
          ],
          "minimum_should_match": "1"
        }
      },
      "script_score": {
        "script": "_score * (doc['_type'].value == 'Person' || doc['_type'].value == 'Event'? 2 : 1)"
      }
    }
  }
}